赞
踩
前面我们介绍了:
今天来介绍下索引的命中率问题。
一、说明
前面介绍了MySQL的索引但是如何确保查询是走索引的哪?如果查询没有走索引那我们的索引创建的不是没啥意义了吗?
下面就来举例子说明,下面的操作中id和email为索引字段。
二、哪些查询是走索引的
2.1、link
数据量大的时候避免使用like(可以使用第三方工具),小的时候可以考虑(不会走索引)。
select * from tb1 where email like '%cn';
2.2、函数
使用函数的时候也不会走索引。
select * from tb1 where reverse(email) = 'wupeiqi';
2.3、or
查询时,where后的第一个条件是索引列,or 第二个条件不是索引列时,不会命中索引。
select * from tb1 where nid = 1 or name = 'seven';
补充:
当or条件中有未建立索引的列才失效,以下会走索引。
select * from tb1 where nid = 1 or email = 'seven'; #两个都是索引列时会走索引
select * from tb1 where nid = 1 or name = 'seven' and email = 'alex' #走索引,第一个和第三个条件是索引列时会走索引
2.4、类型不一致
如果列是字符串类型,传入条件是必须用引号引起来,不然...。
select * from tb1 where email = 999; #类型不一致时不走索引
2.5、!=
select * from tb1 where email != 'alex' #普通索引不会走索引
特别的:如果是主键,则还是会走索引
select * from tb1 where nid != 123 #主键还是会走索引的
2.6、>
select * from tb1 where email > 'zmr' #普通索引不会走索引
特别的:如果是主键或索引是整数类型,则还是会走索引
select * from tb1 where nid > 123; #主键还是会走索引的
select * from tb1 where num > 123; #普通索引是数字的时候还是会走索引的
2.7、order by
select name from tb1 order by email desc; #select后面加的关键字(不是索引)和order by后面的分类的关键字不是一致时不会走索引
当根据索引排序时候,选择的映射如果不是索引,则不走索引
特别的:如果对主键排序,则还是走索引:
select * from tb1 order by nid desc; #order by后面加的主键时会走索引
2.8、组合索引最左前缀
如果组合索引为:(id,name,email)
id and email #使用索引
id and name #使用索引
id and name and email #使用索引
name #不使用索引
email #不使用索引
name and email #不适用索引
2.9、其他性能相关
避免使用:select *
count(1)或count(列) 代替: count(*)
创建表时尽量时 char 代替 varchar #尽量用定长,将定长(char)的字段往前放,变长(varchar)的放后面
组合索引代替多个单列索引(经常使用多个条件查询时)
尽量使用短索引:如果一个字段的值中有相同的字符串,那么就可以创建局部索引(把不相同的字段创建索引即可);
使用连接(JOIN)来代替子查询(Sub-Queries) #MySQL中这两个的类别不大,sql server里是有差别的
连表时注意条件类型需一致:查询的条件要一样,数据类型也要一样
索引散列值(重复少)不适合建索引,例:性别不适合
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。