数据库查询的时候如何提高效率 我相信大部分的人都会回答创建索引 但是索引的数据类型是啥 索引的分类 索引的实现原理、索引的具体优化 我相信大多数人还是一脸懵逼的 那么我们现在就简单地聊一聊索引。
优势:这个话不多说 可以显著的提高查询效率 就像兰博基尼与三轮车的差距
劣势:索引本身也会占据空间 且会消耗时间 创建索引的时候整个表会被锁死 推荐在数据库不被使用时创建 并会降低增删改表结构的效率 因为对表结构物的更改也会牵扯到索引的更改
Mysql支持多种索引实现例如:哈希索引、BTree索引、B+Tree索引、全文索引 其中Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引
哈希索引:讲索引列以key-value形式用hash值做存储 使用的是散列算法 所以速度上会非常的快 但是因为多个数据在存储结构上也是没有任何关系的 所以不支持范围查找 且不支持多列联合索引的最左匹配原则(这个在后续会有说明) 如果hash值有大量重复键值的情况下 效率也会降低 因为会存在hash碰撞的问题。BTree索引和B+Tree索引:B+Tree索引:
BTree是平衡搜索多叉树,设树的度为d(d>1),高度为h,那么BTree要满足以一下条件:
每个叶子结点的高度一样,等于h;每个非叶子结点由n-1个key和n个指针point组成,其中d<=n<=2d,key和point相互间隔,结点两端一定是key;叶子结点指针都为null;非叶子结点的key都是[key,data]二元组,其中key表示作为索引的键,data为键值所在行的数据;B+Tree索引:
B+Tree是BTree的一个变种,设d为树的度数,h为树的高度,B+Tree和BTree的不同主要在于:
B+Tree中的非叶子结点不存储数据,只存储键值;B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储键值对应的数据的物理地址;聚合索引和非聚合索引
在B+Tree下 叶子存储了整行数据的是主键索引 又被称为聚簇索引 存储了主键的值的是非主键索引 又被称为非聚簇索引 相比较之下聚簇索引查询效率比非聚簇快 因为根据主键索引查出来的结果就是需要的数据 但是非聚簇索引查出来的只是索引主键的值 还需要将主键的值再放入数据库中查询一次 再做一次回表操作 (覆盖索引除外 及一个查询所需要的值在索引中即可得到)
联合索引即为对多列中进行组合索引 一般将使用度最高的放在最左侧 因为索引有一个最左前缀匹配原则 即创建了(1,2,3,)联合索引时 当查询1,12,123时可以用到索引 但是查询2,3,23,13时却不会使用索引
在MySQL5.6中 对索引新增了索引下推 在一句select * from table where age = '0' and name like '