加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中索引的案例剖析

发布时间:2022-02-23 18:51:38 所属栏目:MySql教程 来源:互联网
导读:小编给大家分享一下MySQL中索引的案例分析,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧! 1. 索引种类 在 MySQL 中,从索引的逻辑或者说字段特性来区分,索引大致分为以下几个种类:普通索引、唯一索引、主键索引、联合索引和前缀索引。
        小编给大家分享一下MySQL中索引的案例分析,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!
 
1. 索引种类
       在 MySQL 中,从索引的逻辑或者说字段特性来区分,索引大致分为以下几个种类:普通索引、唯一索引、主键索引、联合索引和前缀索引。
 
普通索引:最基础的索引,没有任何限制。
唯一索引:索引列的值必须唯一。
主键索引:特殊的唯一索引,作为主键它的值不能为空。
联合索引:联合索引就是索引列为多个字段的普通索引,需要考虑最左前缀原则。
前缀索引:对字符类型的前几个字符或二进制类型的前几个字节建立索引。
还有另外一种从物理存储上来区分的索引分类:聚簇索引和非聚簇索引。
 
聚簇索引:索引顺序与数据存储顺序一致,其叶子节点存储的是数据行。
非聚簇索引:非聚簇索引的叶子节点存储的是聚簇索引的值,同时它是基于聚簇索引创建的。
简单来说,所谓的聚簇索引就是索引 key 与数据行在一起,而非聚簇索引的索引 key 对应的值是聚簇索引的值。
 
2. 索引的数据结构
       常见的用于实现索引的数据结构有哈希表、有序数组和搜索树。
 
2.1 哈希索引
哈希表是一个以 key-value 形式来存储数据的容器,和 HashMap 一样,哈希索引也会将 key 通过特定的哈希函数计算得到索引值,然后在数组的相应位置存放 key 对应的 value,如果有两个 key 通过哈希函数计算得到的索引值相同(发生哈希冲突),那么数组的这个位置就会变成一个链表,存放所有哈希值相同的 value。
 
所以在一般情况下,哈希表进行等值查询的时间复杂度可以达到 O(1),但是在发生哈希冲突的情况下,还需要额外遍历链表中的所有值,才能够找到符合条件的数据。
  
2.2 有序数组
有序数组顾名思义是一个按照 key 的顺序进行排列的数组,它进行等值查询的时间复杂度使用二分查询可以达到O(logN),这与哈希表相比逊色不少。
 
但是通过有序数组进行范围查询的效率较高:首先通过二分查询找到最小值(或最大值),然后反向遍历,直到另一个边界。
 
至于排序,有序数组本来就是有序的,天然已经排好序了,当然排序字段不是索引字段就另说了。
 
但是有序数组有一个缺点,由于数组元素是连续且有序的,如果此时插入新的数据行,为了维持有序数组的有序性,需要将比此元素 key 大的元素都往后移动一个单位,给他腾出一个地方插入。而这种维护索引的方式的代价是很大的。
 
所以,有序数组适合存储衣服初始化过后就不再更新的数据。
 
2.3 搜索树
了解过数据结构的人应该会知道,搜索树是一个查询时间复杂度为O(logN),更新的时间复杂度也是O(logN)的数据结构。所以搜索树相较于哈希表和有序数组来说兼顾查询与更新两方面。也正是由于这个原因,在 MySQL 中最常用的数据模型就是搜索树。
 
而考虑到索引是存放在磁盘中的,如果搜索树是一棵二叉树,那么它的子节点只能有左右两个,在数据比价多的情况下,这棵二叉树的树高可能会非常高,当 MySQL 进行查询的时候,可能由于树高导致磁盘I/O次数过多,查询效率变慢。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读