赞
踩
特点:
优点:
分类:
选择合适的列作为索引
经常作为 查询条件(WHERE 子句)、排序条件(ORDER BY 子句)、分组条件(GROUP BY 子句) 的列是建立索引的好候选。
区分度低的字段,例如性别,不要建索引
频繁更新的字段,不要作为主键或者索引
不建议用无序的值(例如身份证、UUID )作为索引,当主键具有不确定性,会造成叶子节点频繁分裂,出现磁盘存储的碎片化
避免过多的索引
每个索引都需要占用额外的磁盘空间。
更新表(INSERT、UPDATE、DELETE 操作)时,所有的索引都需要被更新。
维护索引文件需要成本;还会导致页分裂,IO 次数增多。
利用前缀索引和索引列的顺序
对于字符串类型的列,可以考虑使用前缀索引来减少索引大小。
在创建复合索引时,应该根据查询条件将最常用作过滤条件的列放在前面。
最左匹配原则:在 InnoDB 的联合索引中,查询的时候只有匹配了前一个/左边的值之后,才能匹配下一个。
根据最左匹配原则,我们创建了一个组合索引,如 (a1,a2,a3),相当于创建了(a1)、(a1,a2)和 (a1,a2,a3) 三个索引。
为什么不从最左开始查,就无法匹配呢?
比如有一个 user 表,我们给 name 和 age 建立了一个组合索引。
ALTER TABLE user add INDEX comidx_name_phone (name,age);
从这张图可以看出来,name 是有序的,age 是无序的。当 name 相等的时候, age 才是有序的。
这个时候我们使用 where name= ‘张三‘ and age = ‘20 ‘
去查询数据的时候, B+Tree 会优先比较 name 来确定下一步应该搜索的方向,往左还是往右。如果 name 相同的时候再比较 age。但是如果查询条件没有 name,就不知道下一步应该查哪个 节点,因为建立搜索树的时候 name 是第一个比较因子,所以就没用上索引
MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。
索引下推
的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。
在没有使用ICP的情况下,MySQL的查询:
Server
层去检测该记录是否满足WHERE
条件。使用ICP的情况下,查询过程:
WHERE
条件部分能否用索引中的列来做检查,条件不满足,则处理下一行索引记录;Server
层,Server
层检测该记录是否满足WHERE
条件的其余部分。例子:例如一张表,建了一个联合索引(name, age),查询语句:select * from t_user where name like '张%' and age=10;
,由于name
使用了范围查询,根据最左匹配原则:
但是,使用了索引下推优化,把 where 的条件放到了引擎层执行,直接根据name like '张%' and age=10
的条件进行过滤,减少了回表的次数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。