这几天把索引有关的知识系统看了一遍,现在总结如下。
理解mysql中索引是如何工作可以参考一本书的索引部分,要想在一本书中快速找到某个特定主题,一般会先看书的索引部分即目录,快速找到对应的页码。
在mysql中索引使用的方法和书类似,其先在索引中找到对应的值,然后根据匹配的索引纪录找到对应的数据行。在mysql中索引是在存储引擎层而不是在服务器层实现的。
重点关注B-tree索引
B-Tree索引通常意味着所有的值是按顺序存储的,并且每一个叶子到根的距离相同。B-Tree索引能够加快数据访问速度,因为存储引擎不需要扫描全表,取而代之的是从索引的根节点开始进行搜索。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么找到对应的值,要么该纪录不存在。
因为索引树中的节点是有序的,所以除了按值查找之外还可以用于查询中的order by操作。
关于B-Tree 索引的限制
1,如果不是按照索引的最左列开始查找,则无法使用该索引。
2,不能跳过索引中的列。如果跳过了索引中的列,那么被跳过的列之后的索引都无法使用
3,如果查询中有某个列的范围查询,则其右边的列都无法使用索引优化查询
4,mysql能在索引中做最左前缀匹配的like比较,如果是通配符开头的like查询,存储引擎无法比较匹配
所以,建立索引的顺序非常重要。
索引的优点
1,索引大大减少了服务器所需要扫描的数据量
2,索引可以帮助服务器避免排序和临时表
3,索引可以将随机I/O 变为顺序I/O
索引评级
索引将相关的纪录放到一起则获得一星;如果索引中的数据顺序和查找中的排列顺序一致则获得二星,如果索引中的列包含了查询中所需要的全部的列则获得三星
索引的选择性是指不重复的索引数和数据表的的纪录总数的比值。范围从0.1-1,索引性的选择性越高则查询的效率越高,唯一索引的选择性是1,性能也是最好的。
对于BLOG,TEXT,或者很长的varchar类型的列,必须使用前缀索引。而要取几位前缀需要通过在数据表里进行实验来确定,取几位的选择性最高就取几位。
当不需要考虑排序和分组的时候,将选择性最高的列放在前面通常是很好的,这时候索引的作用只是用于优化where条件的查找了
order by 子句不满足索引的最左前缀的要求,也可用于查询排序,这是因为索引的第一列被指定为一个常数。
索引使用的基本原则,尽可能将需要做范围查询的列放倒索引的后面。