在前一篇文章中,我们已经介绍了索引、索引的优化规则等等

原文链接:Siam博客 mysql索引优化

在其中我们有引申出组合索引,多个单字段索引冲突两个知识点。

本文章主要是与后者有关联。

在原文中,我们使用了下面的例子

现在有这样子的数据量:
100W条数据 user_name=’我是用户名’
100条数据 user_phone=’110′
5条数据 user_name=’我是用户名’ and user_phone=’110′ 假设有这样子一条语句: select * from test where user_name = '我是用户名' and user_phone='110' 有两个字段都有索引可用,mysql会选择一个使用。这是属于mysql的内部处理判断 正常情况下,如果用user_phone索引生效的话,会很快得到结果(先筛选出100条 再筛选) 如果user_name生效,则要先筛选100W条数据,再筛选user_phone mysql内部的错误判断可能使得user_name索引生效,此时效率就会很低了,我们可以强制使用某个索引

指定使用索引的意义

从以上例子中,我们可以思考并归纳。能提升效率的核心是:在一开始就尽可能地筛选出准确的数据

所以当我们发现mysql可能处理出错的情况时,可以手动指定使用更优的索引来提高查询效率。

这个可以称为索引降维

降维

数据的选择度越大,则维度越大。

降维,按我个人的理解是:在大量的数据中,一层一层地筛选过滤,维度也会逐渐减低。

点线面中,共有黑红两种颜色。

目标:筛选出所有红色的点

步骤:选出所有带有红色点的面 –> 选出所有带有红色点的线 –> 在线上选出所有红色点

索引降维

在老旧的mysql版本中,where的条件顺序还会很大影响执行结果。
比如在上面的举例中,用条件语句来举例,而不是索引

select * from test where user_name = '我是用户名' and user_phone='110'
select * from test where user_phone='110' and user_name = '我是用户名'

这两个语句会出现上面索引冲突时 mysql没有使用更优索引的情况一样,第一条语句会先筛选出100W条数据,再筛选user_phone=110

然而在后续的mysql发展中,sql构造器优化器会自动帮我们排序执行,这种问题已不太需要人工去调整。

但是当我们建立组合索引的时候,则会根据我们的选择顺序来构建了。

比如有这么一个索引

index user_info (user_name, user_phone)

我们可以用大小分类的情况举例看一下

└名字一
└──user_phone 110
└──user_phone 120
└──user_phone 119
└名字二
└──user_phone 110
└──user_phone 120
└──user_phone 119
└名字三
└──user_phone 110
└──user_phone 120
└──user_phone 119

而如果我们把顺序调整成(user_phone, user_name)

那么就可以把组合索引看成

└─110
└──user_name 名字一
└──user_name 名字二
└──user_name 名字三
└─120
└──user_name 名字一
└──user_name 名字二
└──user_name 名字三
└─119
└──user_name 名字一
└──user_name 名字二
└──user_name 名字三

两种情况,都会在某些场景下有自己的优势,所以我们就需要结合自己的业务数据来进行选择啦。

用我们的老例子来说:
以名字来区分,第一次筛选出现100W条数据,然后再筛选手机号。
以手机号来区分,第一次筛选出现100条数据,然后再筛选用户名。

同样的情况还出现在分表中,用什么条件来分表也是极其重要的。

分表中,如果我们以订单的年份作为分表条件,想要搜索ID=3的会员在2019年某个月份日期的订单,那么我们需要先搜索2019年的表(一年的订单假设有100W条记录),然后再筛选用户ID和其他月份等条件。

如果我们以订单的年份+月份作为分表条件(只是举例,有很多分表条件可以决定),那么初步筛选的数据就会少了很多了,后续的筛选步骤也会更快完成。

总结

在分表、组合索引等等场景下,我们可以结合业务数据,进行降维的顺序思考,尽可能地在一开始就筛选出比较准确的数据,在后续的筛选中则只需要遍历检查很少的一部分数据,已达到提高查询效率的效果。

本文由Siam博客原创,原文地址:原文地址

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

Mysql索引降维 优化查询 提高效率的更多相关文章

  1. MySQL索引和优化查询

    索引和优化查询 恰当的索引可以加快查询速度,可以分为四种类型:主键.唯一索引.全文索引.普通索引. 主键:唯一且没有null值. create table pk_test(f1 int not nul ...

  2. MySQL 千万 级数据量根据(索引)优化 查询 速度

    一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让 ...

  3. 理解MySQL——索引与优化

    转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...

  4. mysql索引的优化

    MySQL索引的优化 上面都在说使用索引的好处,但过多的使用索引将会造成滥用.因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT.UPDATE和DEL ...

  5. 【真·干货】MySQL 索引及优化实战

    热烈推荐:超多IT资源,尽在798资源网 声明:本文为转载文章,为防止丢失所以做此备份. 本文来自公众号:GitChat精品课 原文地址:https://mp.weixin.qq.com/s/6V7h ...

  6. MySQL数据库索引类型、MySQL索引的优化及MySQL索引案例

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  7. MySQL索引及优化(1)存储引擎和底层数据结构

    在昨天的面试中问到了MySQL索引怎么优化(查询很慢怎么办),回答的很不理想,所以今天来总结几篇关于MySQL索引的知识. 1.什么是索引? 首先我们一定要明确什么是索引?我自己的总结就是索引是一种数 ...

  8. mysql use index() 优化查询

    mysql use index() 优化查询 FORCE INDEX/IGNORE INDEX 的语法: SELECT *** FROM TABLE [{USE|IGNORE|FORCE} INDEX ...

  9. mysql索引与优化

    mysql 索引与优化 http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html

随机推荐

  1. 基于CC2530的ZigBee最小系统

    http://www.cirmall.com/circuit/1946/%E5%9F%BA%E4%BA%8ECC2530%E7%9A%84ZigBee%E6%9C%80%E5%B0%8F%E7%B3% ...

  2. 10.8 ss:查看网络状态

    ss命令 是类似并将取代netstat的工具,它能用来查看网络状态信息,包括TCP.UDP连接.端口等.它的优点是能够显示更多更详细的有关网络连接状态的信息,而且比netstat更快速更高效.    ...

  3. [ Java面试题 ]Java 开发岗面试知识点解析

    如背景中介绍,作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向. 在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Jav ...

  4. gin使用validator库参数校验若干实用技巧

    validator库参数校验若干实用技巧 本文介绍了使用validator库做参数校验的一些十分实用的使用技巧,包括翻译校验错误提示信息.自定义提示信息的字段名称.自定义校验方法等. validato ...

  5. elasticsearch_dsl 操作

    import elasticsearch from elasticsearch_dsl import Search, MultiSearch # Search-执行一个搜索,MultiSearch-同 ...

  6. 视觉SLAM的主要功能模块分析

    视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...

  7. CodeGen概述

    CodeGen概述 CodeGen是在协同开发环境中工作的软件开发人员可以用来生成源代码的工具.该代码可能是Synergy DBL代码,也可能是其他语言的源代码.CodeGen并不局限于为任何特定的开 ...

  8. 理想的GVS智能照明体验,就在汕头迎宾花园酒店

    汕头,依海而生,海在城中央是汕头特色. 汕头湾将汕头分为南北两岸,造就绝美市区海岸线,一碧万顷的海湾,焕然一新的海港,在市区就能直接看海. 在北山湾,动可结伴冲浪,静可观海吹风,动静都是一种快乐. 当 ...

  9. vscode使用版本控制git commit unstaged时提示对话框的设置

    使用 vscode 版本控制提交代码时,如果有 unstaged file,会有一个弹出框: 选择 always 或者 never ,这个框下次就不再弹出了. 如果你想让他再次出现,请去setting ...

  10. mybatis——解决属性名和数据库字段名不一致问题(注解方式)

    当我们使用注解开发时有时会遇到数据库字段名与实体类属性名不一致的问题.xml方式开发可以通过结果集映射的方式解决,那注解方式开发要怎么解决呢? 注解解决方式: @Results()注解 Results ...