索引
先在索引中找 到对应值,然后根据匹配的索引记录找到对应的数据行。
索引可以包含一个或多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。
MySQL中,索引是在存储引擎层而不是服务器层实现的。
B-Tree索引
InnoDB的B-Tree索引使用的是B+Tree。
索引对多个值进行排序的依据是CREATE TABLE语句中定义索引时列的顺序。
B-Tree索引适用于全键值、键值 范围或键前缀查找。其中键前缀查找只适用于根据最左前缀的查找。
因为索引树中的节点是有序的,所以除了按值查找之外,索引还可 以用于查询中的ORDER BY操作(按顺序查找)。
B-Tree索引的限制
- 如果不是按照索引的最左列开始查找,则无法使用索引。
- 不能跳过索引中的列。
- 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。
例如有查询WHERE last_name='Smith' AND frst_name LIKE 'J%' AND dob='1976-12-23' ,这个查询只能使用索引的前 两列,因为这里LIKE 是一个范围条件(但是服务器可以把其余列 用于其他目的)。如果范围查询列值的数量有限,那么可以通过使 用多个等于条件来代替范围条件。
哈希索引
在MySQL中,只有Memory引擎显式支持哈希索引。
****哈希索引的限制
- 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。
- 哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
- 哈希索引只支持等值比较查询,包括=、IN()、<=> (注释:在mysql中,“<=>”的意思为“安全等于”,是一个比较运算符,和“=”等于运算符类似,不过“<=>”可以用来判断NULL值:当两个操作数均为NULL时,其返回值为1而不为NULL;而当一个操作数为NULL时,其返回值为0而不为NULL)
InnoDB引擎有一个特殊的功能叫做“自适应哈希索引(adaptive hash index)”。当InnoDB注意到某些索引值被使用得非常频繁时,它会在内 存中基于B-Tree索引之上再创建一个哈希索引。
如果存储引擎不支持哈希索引,则可以模拟 像InnoDB一样创建哈希索引:
在B-Tree基础上创建一个伪哈希索引。这和真正的哈 希索引不是一回事,因为还是使用B-Tree进行查找,但是它使用哈希值 而不是键本身进行索引查找。你需要做的就是在查询的WHERE 子句中手 动指定使用哈希函数。
SELECT id FROM url WHERE url="www.mysql.com" AND url_crc=CRC32("www.mysql.com");
缺陷是需要维护哈希值。可以手动维护,也可以使用触发器实现。
如果采用这种方式,记住不要使用SHA1() 和MD5() 作为哈希函数。
要避免冲突问题,必须在WHERE条件中带入哈希值和对应列值。