MySql分享之索引

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 + 树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的

哈希索引的优势:等值查询,哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。)
哈希索引不适用的情况:
不支持范围查询
不支持索引完成排序
不支持联合索引的最左前缀匹配规则

 

posted @ 2020-09-30 11:23  学无止境enjoy  阅读(88)  评论(0)    收藏  举报