如何高效的使用索引
1.在查询时必须使用独立的列,否则不能使用索引。
例如select * from table where id + 1 =5;
这样是不能使用索引的,索引列不能是表达式的一部分
2.前缀索引
有时候索引的字段十分长,会让索引变得大而慢。我们可以采用一种方法是,在表中加一行,存储改字段的哈希值,然后对这个哈希值进行创建索引。这里我们说明另外一种方法,前缀索引。
我们选择索引开始的部分字符,这样可以大大的节约索引的空间,从而提高索引的效率。但是这样遇到的问题是会有许多重复的索引值。我们用选择性来表示查找的效率。选择性是指不重复的索引值和记录总数的比值,显然这个值越接近1越好。
那么现在存在着选择多长的前缀较好了,我们可以观察前若干个字母当做前缀索引,不同的索引项和总数的比值,如果比值趋于稳定,那么我们就选这个值。
例如:select count(distinct left(city,3))/count(*) as sel3,
count(distinct left(city,4))/count(*) as sel4,
count(distinct left(city,5))/count(*) as sel5,
count(distinct left(city,6))/count(*) as sel6,
count(distinct left(city,7))/count(*) as sel7
from city;
在上述例子中,我们列出了选择city列中的前3到7作为索引不同的列和总数的比值。当这个值趋于稳定时,那么就可以取这个值了。
创建前缀索引的方法:
例子:alter table city add key (city(7));
注:反向索引,MySQL中并不支持反向索引,但是可以把字符串翻转后存储来实现反向索引
3.选择合适的索引列顺序
在建立多列索引时,最基本的原则是将选择性最高的列放在最前面是最好的。这样的设计可以优化where条件的查找。
4.聚簇索引
聚簇索引不是一种索引方式,应该叫做一种存储方式。在InnoDB中,这种方式,使用B+树的方式存储整个数据表,使用主键作为索引,在非叶子节点中并不存储实际的数据,而在最后一层的叶子节点中存储该一项的所有数据。举两个例子,InnoDB和MyISAM的实现方法:
例如创建表create table layout_test(
col1 int not null,
col2 int not null,
primary key(col1),
key(col2)
);
假设该表的主键取值是1-10000,按照随机顺序插入,而col2的值是从1-100随机取值,也就是说有很多重复的值
1.MyISAM
数据分布

在MyISAM表中,是按照插入的顺序,按照行来存储实际的数据
主键索引分布

在MyISAM中,主键的索引时按照一个B+树来排序的,非叶子节点中只会存储主键的索引,不会存储内容,而在叶子节点中会存储内容,也就是该主键所存储的位置,但是由于存在一张数据分布表,叶子节点中并没有存储实际的数据。
col2列索引分布

MyISAM中其他的索引和主键索引相似,按照索引的值排成一个B+树,只有叶子节点存储了该索引在表中的位置。
2.InnoDB
在InnoDB中,就不存在数据分布表了,因为InnoDB直接将改行的值存储在了主键分布索引的子节点中。
主键分布

我们看到在该图中的叶子节点存储了该行的其他数据,就不需要再新建一张表存储数据了
二级索引分布

在InnoDB中的二级索引中,同样用B+树来组织,不同的是叶子节点只需要存储主键的位置,使用主键就可以找到该行的其他值了
聚簇索引的优缺点:
优点:
相关的数据放在一起,可以按照索引顺序,顺序的将数据读出
数据在索引内,读取速度快
缺点:
当不是按照主键顺序插入时,可能会导致页分裂,速度较慢
















