1、mysql支持的索引类型。
B-TREES索引的特点:
1、引以B+树的结构存储数据。(mysiam中指向数据的物理地址,innodb中指向主键)
2、能够加快数据的查询速度。
3、更适合进行范围查找。(顺序存储)
在什么情况下可以用的B树索引?
1、全职匹配。
2、匹配最左前缀的查询。
3、匹配列前缀查询。
4、匹配范围值的查询。
5、精确匹配左前列并范围匹配另一列。
6、只访问索引的查询。
使用限制:
1、如果不是按照索引最左列开始查找,则服务使用索引。
2、使用索引时不能跳过索引中的列。
3、not in 和<>操作无法使用索引。
4、如果查询中有某个列的范围查询,则其右边所有列都无法使用索引。
Hash索引特点:
1、hash索引是基于hash表实现的,只有查询条件精确匹配hash索引中的所有列时,才能够使用到hash索引。
2、对于hash索引中的所有列,存储引擎都会为每一行计算一个hash码,hash索引中存储的就是hash码。
使用限制:
1、hash索引必须进行2次查找。
2、hash索引无法用于排序。
3、hash索引不支持部分索引查找也不支持范围查找。
4、hash索引中hash码的计算可能存在hash冲突。
为什么要使用索引?
1、索引大大减少了存储引擎需要扫描的数据量。
2、可以帮助我们进行排序以避免使用临时表。
3、可以把随机I/O变为顺序I/O、
索引是不是越多越好?
1、索引会增加写操作的成本。
2、太多的索引会添加查询优化器的选择时间。
索引优化策略:
1、索引列上不能使用表达式或函数。
2、前缀索引和索引列的选择性。选择性(是指不重复的索引值和表的记录书的比较)。
3、联合索引。
如何选择索引列的顺序。
1、经常会被使用到的列优先。
2、选择性搞的列优先。
3、宽度小的列有先。
4、覆盖索引
有点:
1、可以优化缓存,减少磁盘IO操作。
2、可以减少随机IO,变随机IO操作变为顺序IO操作。
3、可以避免对INNODB主键索引的二次查询。
4、可以避免myisam表进行系统调用。
无法使用覆盖索引的情况:
1、存储引擎不支持覆盖索引。
2、查询中使用了太多的列。
3、使用了双%号的like查询。