索引是什么?
索引是一种帮助MySql高效获取数据的一种数据结构(B+Tree索引和Hash索引),一般默认是B+树
优点:1.提高查询效率,降低IO使用率
2.降低CPU的使用率(B树本身就是一个排序好的结构,排序的时候直接使用)
缺点:1.本身占用内存,一般存在于硬盘
2.降低增删改的效率
索引为什么快?
因为用的是B+树,查找的时候通过索引列表迅速定位到数据存放的位置
索引选择的原则?
1.占用存储空间少以及存储空间固定的字段
2.经常使用的字段,如where子句中的
3.更新频繁的字段不适合做索引
4.最左前缀原则
什么是最左前缀原则?
mysql联合索引的时候,最左优先。如果是abc三列索引,则a,ab,abc都能建立索引,否则会索引失效
索引覆盖:
不读取源文件,只从索引文件中获取数据(不需要回表查询)using index
索引的优化:
1.根据sql解析的顺序,调整索引的顺序
2.范围查询in有时候会导致索引失效,可以交换索引顺序,把in放在最后面
3.最佳左前缀,保证顺序一致性
4.小表驱动大表
5.建立在经常使用的字段
优化sql的方法:
1.exist和in(联表查询中):如果主查询的数据集大,用in
如果子查询的数据集大,用exist
2.order by的优化:双路排序和单路排序
索引的失效:
1.复合索引没有按照最左前缀原则
2.在索引上进行操作(计算,函数,类型转换)
3.复合索引不能使用!= <>或者is null,否则会失效
4.like尽量以常量开头,%开头会导致索引失效
5.类型转换会导致索引失效
6.使用or
慢查询优化思路:
1.开启慢查询日志功能,把慢sql找出来
2.选用合适的字段类型做索引,节省空间
3.子查询的exist和in
4.使用join代替子查询:这样就不用创建临时表了,但是也不是很高效
可以对关联查询进行分解,就是对每个表进行一次单表查询,把查询结果关联起来
5.不用select *
6. 给where子句和order by子句涉及到的列创建索引
7.保证最左前缀原则