为什么使用索引:
1、索引大大减少了存储引擎需要的扫描数据量?
2、帮助我们进行排序避免使用的临时表?
3、把随机IO变为顺序IO 菠菜源码搭建QQ:2152876294 网址diguaym.com
索引是不是越多越好:
1、索引增加写入的成本?
2、太多索引会增加查询优化器的选择时间
索引是在存储引擎层的作用:
B-tree索引的特点:
1、常见索引,默认的索引,叶子键遍历?
2、以B+树的结构存储数据?
3、能加快数据的查询速度?
4、适合进行范围查找
什么情况下可以使用B树索引:
1、全值匹配的查询?
2、匹配最左前缀的查询–联合索引,日期和某个字段?
3、匹配列前缀查询例如 order link “984%”?
4、匹配范围值查询-order>’987897’ and order <’999978’?
5、精确匹配左前列并范围匹配另外一列?
5、只访问索引的查询?
6、order by也可以使用B树索引
B树索引的限制:
1、如果不是按照索引的最左列开始查找,则无法使用索引?
2、使用索引的时候不能跳过索引中的列?
3、NOT in和 <>操作无法使用索引的?
4、如果查询中有某个列的范围查询,则其右边所有列都无法使用索引
Hash索引的特点:
需要进行两次查询,先查HASH码,再找到相关的行数据,因为存储在内存中,所以并不影响?
1、Hash索引是基于HASH表实现的,只有查询条件精确匹配HASH索引中的所有列时,才能使用到HASH索引(也就是只能用到等值查询,范围查询不能用到)?
2、对于HASH索引中的所有列,存储引擎都会为每一行计算一个HASH码,HASH索引中的存储就是HASH码
HASH索引的限制:
1、HASH索引必须使用二次查找?
2、HASH索引无法用于排序?
3、HASH索引无法用于范围查找?
4、HASH索引部分查询?
5、不要使用到选择性很差的字段(例如男女性别),造成大量HASH重复,×××重复比较少可以建立HASH索引?
6、根据第5条明白存在HASH冲突
HASH在innodb是自适应的
HASH在innodb是自适应的,查看是否开启自适应?
mysql> show variables like ‘innodb_adaptive_hash_index’;
索引优化策略:
1、索引列不能使用表达式或者函数?
例如:select …. from product where to_days(a_day)-to_days(b_day)<=30?
使用到了to_days函数,是不行的?
改下为 select …. from product a_day<=data_add(current_date,interval 30 day )?
2、前缀索引和索引列的选择性—字符串很长的情况下,会降低索引的效果,字符串前缀建立索引?
原文地址:http://blog.51cto.com/13910918/2155266