查询时指定列
在select 是禁止使用,尽量指定自己需要使用的列,下面测试一下指定列和不指定的执行时间
准备表和数据:
创建存储过程,插入1千万条数据:
执行存储过程:
查看查询执行结果:
结果显而易见。
创建索引
索引是可以对记录集合的字段进行排序的方法。在一张表中给一个字段创建一个索引,将创建另外一个数据结构,这个数据结构包含该字段的数值以及指向这一列的指针,然后创建完之后会对这个索引进行排序。如下图:
索引创建原则
查询频繁的列,在where,group by,order by,on从句中出现的列
长度小的列,字段越小越好
尽可能使用not null 的字段作为索引
最左原则,(后面会详细说)
频繁更新的列尽量上放到索引中
多使用聚集索引
性能分析
创建索引与不创建索引的查询比较:
在 中创建字段 为索引
耗时:3 s 182 ms
耗时:66 ms
创建索引之后
没有创建索引之前
创建聚合索引原则
新建一个表test ,创建一个聚合索引
分析下面的sql哪些使用索引的情况
执行结果:
说明此处有命中索引;
此处的key_len 是16 , 因为int是4个字节,此处命中的索引是,所以是16。此处的等价于。
: 表示有命中索引;
:次数只有连个字段命中索引,即a,b
: 表示有命中索引;
:只有两个字段命中索引,还是a,b,因为遇到的时候,后面的索引就不生效了。
:表示有命中索引;
:只有一个字段命中索引,此处只有a命中索引,根据最左原则,会从最左开始匹配,a匹配完会找b,但是b是返回查找,不能使用索引,所以此时就只有a命中索引。
总结:
最左前缀原则
最左前缀原则指的的是在sql where 字句中一些条件或表达式中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要出现非顺序出现、断层都无法利用到多列索引。mysql会一直向右匹配直到遇到范围查询(>、
Explain使用分析
参考:https://segmentfault.com/a/1190000008131735
如果觉得本文对你有帮助,请打赏以回报我的劳动
领取专属 10元无门槛券
私享最新 技术干货