数目 | 索引前三个字符 |
---|---|
500 | abc |
465 | asd |
455 | acd |
431 | zaf |
430 | aaa |
420 | vvv |
411 | asv |
512 |
如果每一列的数据都比较大,说明区分度还不高需要增大索引字符数,直到这个前缀的选择性接近完整列的索引性,也就是前面的数据要尽可能的小。
计算完整列的选择性,并使前缀的选择性接近于完整列的选择性。下面语句用户计算完整列选择性:
-- 不同字符串的数目/总的数目就是完整列选择性 select count(distinct name)/count(*) from person;
下面语句计算索引前 3 个字段选择性:
-- 前3个字符不同的字符串数据/总的数据 select count(distincy left(city,3))/count(*) from person
不断增大索引字符数目,直到选择性接近完整列选择性且继续增大数据选择性提升幅度不大的时候。
创建方法
-- 假设最佳长度为4 alter table person add key (name(4));
多列索引
不少人有这样的误解,如果一个查询用有多个字段 ‘and'查询,那么给每个字段都建立索引不就能最大化提高效率了?事实并不是如此,mysql 只会选择其中一个字段来进行索引查找。这种情况下应该建立多列索引(又叫联合索引),就能利用多个索引字段了,注意索引列顺序要和查询的顺序一致。
在 5.0 及以上版本中引入了“索引合并”的策略。一定程度上也可以使用多个单列索引,比如下面的查询:
-- mysql会分别使用name和age索引查出数据然后合并 -- 如果使and则查出数据后再对比取交集 select * from person where name = "bob" or age=12
但是不推荐这么做,and 或 or条件过多会耗费大量的 CPU 和内存在算法的缓存、排序和合并操作上。
选择合适的索引列顺序
在一个多列 B-Tree 索引中,索引列的顺序意味着索引首先是按照最左列进行排序,然后是第二列…索引一个良好的多列索引应该是将选择性最高的索引放在最前面,然后依次降低,这样才能更好的利于索引。选择性计算方发见:前缀索引 小节。
聚族索引
聚族索引不是一种单独的索引类型,而是一种数据存储方法,具体的细节依赖其实现方式。
InnoDB 的聚族索引实际是在同一个结构中保存索引值和数据行。因为不能同时将数据行放在两个不同的地方,所以一个表只能有一个聚族索引。InnoDB 的聚族索引列为“主键列”。
如果没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果这样的索引也没有,InnoDB 会隐式定义一个主键来作为聚族索引。
聚族索引的主要优点是:可以把相关数据保存在一起,减少磁盘 IO,提高查询效率。但是也有缺点:
覆盖索引
简单来说就是一个索引覆盖了需要查询的列字段,这样就不需要再到聚族索引中利用主键进行二次查找,在一个二级索引中就能取到所需的数据。
InnoDB 的索引会在叶子节点中保存索引值,因此如果要查询的字段全部包含在某个索引中,且这个索引被使用了,那么就能极大的提高查询速度。比如如下查询语句:
-- name有索引的情况下,直接从索引的叶子节点中取name值返回,无需二次查找 select name from person where name = 'abc' -- 如果存在`name,age`聚合索引,也会直接返回数据,无需二次查找 select name,age from person where name='abc' and age=12
使用索引进行排序
mysql 的排序操作也是可以利用索引的,只有当索引的列顺序和ORDER BY的顺序完全一致,并且所有列的排序方法(正序或者倒序)也一样时,才能够使用索引来进行排序。注意:排序的字段可以比对应的索引字段少,但是顺序必须一致。如下:
-- 假设有:(name,age,sex)联合索引 -- 可使用索引排序 select ... order by name desc,age desc select ... order by name desc,age desc,sex desc -- 不可使用排序 select ... order by name desc,sex desc select ... order by name desc,age asc
结束
本篇基于 mysql 5.5 的版本,更新的版本可能会有不一样的策略。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
标签:梅河口 北京 陕西 黔西 荆门 驻马店 昌都 鄂尔多斯
巨人网络通讯声明:本文标题《高效利用mysql索引指南》,本文关键词 高效,利用,mysql,索引,指南,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。