MySQL索引
- MySQL索引结构分析
- 为何需要索引?
- 什么是索引?
- 索引原理
- 索引数据结构
- 索引正确使用
- 参考
MySQL索引结构分析
为何需要索引?
为了解决对数据库加速查询。
什么是索引?
可以理解一本书的目录。索引在MySQL里叫“键“,是存储引擎快速找到记录的一种数据结构。
索引原理
本质通过不断缩小想要获取的数据的范围,最终得到结果。把随机事件变成固定事件。
索引数据结构
索引结构就是B+树,一个平衡二叉树。查询过程如下:
如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之 间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。
B+树结构特点:
非叶子节点只存储键值信息。
所有叶子结点之间都有一个链指针。
数据记录都放在叶子节点。
索引正确使用
不正确的使用索引会带来相反的效果。如索引过多,加入不正确的索引等。
适用索引有一些技巧:
- 索引不会包含有NULL的列。
- 使用短索引。
- 索引列上排序,是不使用索引的。
- like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。
- 不要在列上运算。
- 不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引。
- 索引要建立在经常进行select操作的字段上。
- 索引要建立在值比较唯一的字段上。
- 于那些定义为text、image和bit数据类型的列不应该增加索引。
- 在where和join中出现的列需要建立索引。
- 如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。
- 在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。
多使用查询优化神器-explain