4

深入 MySQL (四) 索引

 3 years ago
source link: https://blog.duval.top/2021/02/05/%E6%B7%B1%E5%85%A5-MySQL-4-%E7%B4%A2%E5%BC%95/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文我们将探讨 MySQL 索引的重要概念以及实现原理。

常见索引模型

模型 优点 缺点 哈希表 等值查询和范围查询都非常高效 插入数据成本高,只适合静态数据存储引擎 二叉搜索树 查询和插入都很高效 树高过大,实际生产中要多次读取磁盘,查询效率不高 N叉树 查询和插入都高效、且树高较低 –

InnoDB索引模型

  • InnoDB使用B+树索引模型,每一个索引都是一棵独立的B+树;

  • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。注意B+树的节点都对应着InnoDB的一个数据页,默认大小16K。也就是说叶子节点里包含着多行数据;

  • 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
    InnoDB索引模型图.png

    InnoDB索引模型图.png

  • 页分裂:插入新数据的时候,B+树节点所在的数据页满了之后,节点会发生分裂,需要申请新的数据页来保存新节点,这个过程叫做页分裂。 –> 页分裂会使得空间利用率下降,并降低性能。

  • 页大小:InnoDB页大小(innodb_page_size)默认值为16kb,可以通过调整页大小来间接改变B+树分叉数量

  • 自增主键:考虑到页分裂的性能影响,使用自增主键要比其他业务字段作为主键ID要更优。因为自增主键的每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

  • 不必使用自增主键的场景:如果该表只有一个索引,且该索引为唯一索引,则适合让该索引直接作为主键索引。这样子可以避免生成两棵索引树以节省空间,并且避免回表以增加查询性能。

  • 回表 :使用非主键索引查询数据的时候,如果所查数据包含了主键以外的数据,则需要回到主键索引进行二次查询,这个过程称为回表。 –> 因此应该尽量使用主键索引查询。

  • 覆盖索引:当二级索引已经“覆盖”了查询需求的时候,该索引可称为覆盖索引。使用覆盖索引可以回表操作,减少搜索B+树的次数。因此,可以为高频查询建立覆盖索引。

  • 最左前缀原则:只要查询条件能够满足联合索引的最左前缀,则可以使用该联合索引来加速检索。因此,建立联合索引时候,需要合理安排字段顺序,充分利用最左前缀原则来减少索引数量。

  • 索引下推优化(index condition pushdown):MySQL5.6之后引入了索引下推,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

  • Change Buffer:当对二级索引数据页进行变更,而这些数据页又不在buffer pool中的时候,会使用Change Buffer来缓存这些变更。这些INSERT, UPDATE, 或者 DELETE 操作(DML)带来的变更会在这些数据页被其他读操作加载进缓存的时候被合并。简单来讲,Change Buffer是用来”懒合并”,将非必需的磁盘读写延后。因此适合写多读少的业务情景。另外,唯一索引无法使用ChangeBuffer,因此一般推荐优先使用普通索引。

MySQL误判索引解决办法

  • 对于由于索引统计信息不准确导致的问题,你可以用 analyze table 来解决;例如,使用delete来删除数据,会导致统计信息不准。
  • 对于其他优化器误判的情况,你可以在应用端用 force index 来强行指定索引,也可以通过修改语句来引导优化器,还可以通过增加或者删除索引来绕过这个问题。

Recommend

  • 121
    • 掘金 juejin.im 6 years ago
    • Cache

    MySQL索引和SQL调优

    [TOC] MySQL索引和SQL调优 本文有参考网上其他相关文章,本文最后有附参考的链接 MySQL索引 MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避

  • 64
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    聊聊Mysql优化之索引优化

  • 91
    • monkeysayhi.github.io 6 years ago
    • Cache

    浅谈MySQL的B树索引与索引优化

    浅谈MySQL的B树索引与索引优化

  • 52
    • database.51cto.com 5 years ago
    • Cache

    带你深入了解MySQL的索引

    (一)关于存储引擎      创建合适的索引是SQL性能调优中最重要的技术之一。在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,以及存储引擎的差异如何影响到索引的选择。

  • 12
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    深入理解 MySQL 索引底层数据结构

    案例 分析以下几条sql的索引使用情况 Mysql的索引分析 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高...

  • 14
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    深入理解 MySQL 索引底层原理

    作者:junshili 一步一步推导出 Mysql 索引的底层数据结构。 Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎...

  • 30
    • www.infoq.cn 4 years ago
    • Cache

    深入理解 MySQL 索引

    前言 当提到 MySQL 数据库的时候,我们的脑海里会想起几个关键字:索引、事务、数据库锁等等, 索引是 MySQL 的灵魂,是平时进行查询时的利器,也是面试中的重中之重 。 可能你了解索引的底层是 b+ 树...

  • 3

    在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,...

  • 0

    什么是倒排索引?有什么好处? 倒排索引是一种用于快速检索的数据结构,常用于搜索引擎和数据库中。与传统的正排索引不同,倒排索引是根据关键词来建立索引,而不是根据文档ID。 倒排索引的建立过程如下:首先,将每...

  • 0

    大家好,我是【码老思】,索引是一个数据库绕不开的话题,今天和大家一起聊聊。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK