MySQL 数据库索引
索引是数据库为提高数据库查询效率的数据结构
MySQL 有哪些情况不走索引?
索引列参与计算;
索引列使用了函数;
匹配值使用了前百分号;
字符串和数字比较;
没有遵循联合索引的最左前缀原则;
引擎认为全表扫描比使用索引的代价更低
索引的三种数据模型
哈希表:哈希表这种结构适用于只有等值查询的场景 MemCached 等 NoSQL 引擎
有序数组:有序数组在等值查询和范围查询场景中的性能就都非常优秀。使用二叉树的原理。时间复杂度是 O logN;但是对于更新来说,效率比较底,所以有序数组索引只适用于静态存储引擎。
搜索树:二叉树->平衡二叉树->平衡 N 叉树
关于 B+Tree
每一个索引在 InnoDB 里面对应一棵 B+树。
根据叶子节点的内容,索引的类型又分为主键索引和非主键索引
主键索引 叶子节点存储的是整行数据,InnoDB 中,主键索引也称聚簇索引(Clustered Index)
非主键索引 叶子节点存储的是主键的值。InnoDB 中,非主键索引也称二级索引(Seconday Index)
主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小(ID 做主键)
B Tree(B-Tree)和 B+Tree 的区别:
B+Tree:
所有的叶子结点使用链表相连,便于区间查找和遍历。B 树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有 B+树好。
b+树的中间节点不保存数据,能容纳更多节点元素。
B-Tree
B 树的每一个节点都包含 key 和 value,因此经常访问的元素可能离根节点更近,因此访问也更迅速
索引示例
R1~R5 的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6)
select * from T where ID=500 和 select * from T where k=5 区别
总结
在实际工作中,索引用处很大。所以,在工作中,我一般都是建好表先不建索引,而是在测试中查看下具体的执行 SQL。根据具体业务来建立对应的索引,因为 MySQL 在执行的时候会选择一个自认为最合适的索引,所以能建立联合索引就建立联合索引,这是用空间换时间的一种方式。
版权声明: 本文为 InfoQ 作者【技术小生】的原创文章。
原文链接:【http://xie.infoq.cn/article/da998286cd99bf94f43a914f7】。文章转载请联系作者。
评论