共计 2031 个字符,预计需要花费 6 分钟才能阅读完成。
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最风行的关系型数据库管理系统之一,在 WEB 利用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
明天咱们就来聊聊 MySQL 的索引。只管 MySQL 有许多长处,然而在海量数据的状况下,性能方面的体现还是会让人捉急,这时候就轮到 MySQL 的索引出场了。我会以抛出问题而后解决问题的形式来进行本次分享。比方:什么是索引?索引能够做什么?为什么应用索引能够提高效率?MySQL 反对哪些索引类型?什么状况下应不建或少建索引?什么是联结索引?为什么说 B + 比 B 树更适宜理论利用中操作系统的文件索引和数据库索引?
一、什么是索引?
官网解释:索引 (Index) 是帮忙 MySQL 高效获取数据的数据结构。
艰深了解:索引是一种非凡的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们蕴含着对数据表里所有记录的援用指针。
二、索引能够做什么?
首先,索引不是万能的,索引能够放慢数据检索操作,但会使数据批改操作变慢。每次批改数据记录,索引就必须刷新一次。为了在某种程度上补救这一缺点,许多 SQL 命令都有一个 DELAY_KEY_WRITE 项。这个选项的作用是临时禁止 MySQL 在该命令每插入一条新记录和每批改一条现有之后立即对索引进行刷新,对索引的刷新将等到全副记录插入 / 批改结束之后再进行。在须要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE 选项的作用将非常明显。
三、为什么应用数据索引能提高效率?
- 数据索引的存储是有序的
- 在有序的状况下,通过索引查问一个数据是无需遍历索引记录的
- 极其状况下,数据索引的查问效率为二分法查问效率,趋近于 log2(N)
四、MySQL 反对哪些索引类型?
咱们这里说的索引类型并不是指“主键索引”、“外键索引”这些,而是索引底层的数据结构。MySQL 的索引数据结构反对以下两种:
- B-Tree 索引。B+ 树是一个均衡的多叉树,从根节点到每个叶子节点的高度差值不超过 1,而且同层级的节点间有指针互相链接,是有序的,如下图:
- Hash 索引。哈希索引就是采纳肯定的哈希算法,把键值换算成新的哈希值,检索时不须要相似 B + 树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可, 是无序的,如下图所示:
* 哈希索引的劣势:等值查问,哈希索引具备绝对优势(前提是:没有大量反复键值,如果大量反复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。)* 哈希索引不实用的状况:* 不反对范畴查问
* 不反对索引实现排序
* 不反对联结索引的最左前缀匹配规定
五、什么状况下应不建或少建索引?
咱们都晓得什么时候应该应用索引,那么,什么时候不应该应用索引呢?咱们下面说到,索引并不是万能的,所以,索引必定也有不实用的场景。以下几个场景的时候,咱们应该尽量不建或者说少建索引:
- 表记录太少。
- 常常插入、删除、批改的表。
- 数据反复且散布均匀的表字段,如果一个表有 10 万行记录,有一个字段 A 只有 T 和 F 两种值,且每个值的散布概率大概为 50%,那么对这种表 A 字段建索引个别不会进步数据库的查问速度。
- 常常和主字段一块查问但主字段索引值比拟多的表字段。
六、什么是联结索引?
- 联结索引是两个或更多个列上的索引。
对于联结索引,MySQL 反对从左到右的应用索引中的字段,一个查问能够只应用索引中的一部份,但只能是最左侧局部。例如索引是 key index (a,b,c),能够反对 a、a,b、a,b,c 这 3 种组合进行查找,但不反对 b,c 进行查找,当最左侧字段是常量援用时,索引就非常无效。
- 利用索引中的附加列,您能够放大搜寻的范畴,但应用一个具备两列的索引不同于应用两个独自的索引。
- 复合索引的构造与电话簿相似,人名由姓和名形成,电话簿首先按姓氏对进行排序,而后按名字对有雷同姓氏的人进行排序。如果您晓得姓,电话簿将十分有用;如果您晓得姓和名,电话簿则更为有用,但如果您只晓得名不晓得姓,电话簿将没有用途。
七、为什么说 B + 比 B 树更适宜理论利用中操作系统的文件索引和数据库索引?
- B+ 的磁盘读写代价更低。B+ 的外部结点并没有指向关键字具体信息的指针,因而其外部结点绝对 B 树更小。如果把所有同一外部结点的关键字寄存在同一盘块中,那么盘块所能包容的关键字数量也越多。一次性读入内存中的须要查找的关键字也就越多。相对来说 IO 读写次数也就升高了。
- B+-tree 的查问效率更加稳固。因为非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查问的门路长度雷同,导致每一个数据的查问效率相当。
八、结语
看到这里,你应该曾经把 MySQL 的索引常识都过了个大略,心愿本文能帮到你,happy hacking。接下来听首听首歌放松一下吧。
真的爱你 BEYOND – BEYOND