在表上创建索引后,如何使用到这些索引需要注意的问题。
1.索引列上不能使用表达式或函数。
例如:
select * from users where upper(name)=’ABC';
改成
select * from users where name=’ABC';
2.前缀索引和索引列的选择性
索引的选择性越高索引效率越高。
3.联合索引
如何选择索引列的顺序
1.经常会被使用到的列优先
联合索引的列索引顺序是从左到右使用的。
2.选择性高的列优先
选择性很差的列不宜放到最左边。比如状态列。
3.宽度小的列优先
4.覆盖索引
索引中包含了所有查询的字段的情况的索引。
优点:
可以优化缓存,减少磁盘IO操作。
可以减少随机IO 变随机IO为顺序IO操作。
避免对INNODB主键索引的二次查询
可以避免myisam表进行系统调用
无法使用覆盖索引的情况:
1.存储引擎不支持覆盖索引
2.查询中使用了太多的列。
3.使用了双%号的like查询
5.使用索引扫描优化排序
索引的列顺序和order by 子句的顺序完全一致
索引中所有列的方向(升序和降序)和order by 子句完全一致
order by 中 的字段全部在关联表中的第一张表中。
6.利用索引优化锁
1.索引可以减少锁定的行数
2.索引可以加快处理速度,同时加快锁的释放。
7.删除重复和冗余的索引
重复的索引:
比如:
primary key(id),unique key (id) ,index (id);
这样索引就重复了
冗余的索引:
index(name) ,index(name,age) 联合索引,那么 index(name) 就冗余了。
可以使用工具
pt-duplicate-key-checker –h=localhost 检查重复索引。
查找未被使用过的索引:
更新索引统计信息及减少索引碎片
analyze table table_name;