mysql的索引知识详解
今天给大家介绍下MySQL的索引知识,大家都知道mysql索引包括了B-Tree索引,哈希索引,空间索引,以及其他类型的索引,那么这些不同类型的索引有什么特别之处?
1.B-Tree索引
例子
BTree索引起作用的情况
1)匹配全名:例如,可以帮助查找name=”Jack”anddob=”1991-09-09″anddesc=”good”的行
2)匹配最左前缀:例如,可以查找所有name=”Allen”的人
3)匹配列前缀:例如,可以查找desc以g开头的人
4)匹配最左前缀的范围值:例如,可以查找namelike”Jac%”的人
5)匹配某列精确值和某列范围值:例如,可以查找name=”Jack”anddesclike”goo%”
BTree索引不起作用的情况
1)查找没有从索引最左边开始的行:例如,查找dob=”1991-09-09″或者desc=”good”,或者namelike”%ack”的行
2)跳过索引列:例如,查找name=”Jack”anddesc=”good”此处跳过了dob
3)存储引擎不优化第一个范围条件右边的列:例如,namelike”Jack%”anddob=”1991-09-09″anddesc=”good”,此处dob和desc不会被优化
2.哈希索引
哈希索引使用一个hash表来保存索引经过hash以后的key,value指向实际数据地址,他是一种高效索引,但也有他的局限性:
1.哈希索引是无序的,所以他只适用于=,<=>,IN()这样的精准查询,而不支持范围查询,如>,<,between。
2.哈希索引不同的值经过hash以后可能存在相同的key,这些相同的key将会使用一个链表保存在一个key对应的地址中,当查询有碰撞的值时,hash索引先通过hash值找到链表,在通过匹配链表里的值来找到对应的数据地址,而当碰撞量大时,hash索引的效率就会降低
一般Hash索引用于将做长字段列的索引,他会将长字段列的索引key压缩为短的hash值,例如:
要建立长的url索引,就可以使用hash索引,由于url比较长,直接建立索引会使索引变得巨大,我们可以为url建立一个索引列,这样就可以压缩索引长度
而如果数据库引擎不支持hash索引,我们可以自己模拟hash索引,
比如一个表中有url列和url_crc列,然后为url_crc建立btree索引
查询的时候使用如下查询
这样就能使hash索引发挥作用,并且得到精确结果
而直接使用url_crc查询,则有可能出现碰撞,例如
有可能查出两条不同的url,因为这两条url的crc32值是一样的
3.全文索引
MyISAM独有的一种特殊索引(从MySQL5.6开始Innodb也支持全文索引),用来检索大段文本,查找文本关键字,索引类型为FULLTEXT,使用match和against函数操作,例如
此处先对content列简历全文索引,然后查找content中含有Thepresident关键字的行
其他
MySQL的索引总是按照字符集的单位最大长度计算,例如engine的索引最大长度是999bytes,而使用了utf8字符集,那么索引的最大长度就是333个字符(utf8单个字符最大为3bytes)
关于mysql的索引知识就介绍到这里,大家如果还有疑问,可以关注课课家,我们将详细为大家介绍mysql相关知识。