2.4 适当建立索引
1.创建并使用自增数字来建立主键索引
2.经常作为where条件的字段建立索引
3.添加索引的字段尽可能的保持唯一性
4.可考虑使用联合索引并进行索引覆盖
2.5 合理使用索引
MySQL索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,
在索引的使用过程中,存在一些使用细节和注意事项。
因为不合理的使用可能会导致建立了索引之后,不一定就使用上了索引
2.5.1 不要在列上使用函数和进行运算
不要在列上使用函数,将导致索引失效
select * from news where year(publish_time) = 2017;
改造为使用索引
select * from news where publish_time = '2017-01-01';
不要在列上进行运算,也会导致索引失效
select * from news where id / 100 = 1;
改造为使用索引
select * from news where id = 100;
2.5.2 类型要匹配
当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。
修改一下表中的数据
update users set name = '123456' where id = 10086;
正常查询与含有隐式转换的对比
发现如果出现隐式数据类型转换时,查询时间会非常长。
2.5.3 首部不出现通配符
当在尾部使用通配符时可以使用索引
当在头部使用通配符时,会导致索引失效
2.5.4 多个单列索引并不是最佳选择
Mysql只能使用一个索引,会从多个索引中选择一个(限制最严格的)索引,因此,为多个列创建单列索引并不能提高Mysql的查询性能。
使用多个单列索引的情况:
alter table users add index index_name(name);
看上去很美好,但文件可能会非常的大
事实上,MySQL只能使用一个单列索引。这样既浪费了空间,又没有提高性能(因为需要回行)为了提高性能,可以使用复合索引保证列都被索引覆盖。
复合索引:
alter table users add index in_x(email,phone,name);
2.5.5 小心复合索引的最左侧原则
查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。
发现如果只按照email查询时索引失效了。
2.5.6 尽可能达成索引覆盖
如果一个索引包含所有需要的查询的字段的值,直接根据索引的查询结果返回数据,而无需读表,能够极大的提高性能。因此,可以定义一个让索引包含的额外的列,即使这个列对于索引而言是无用的。