广告
返回顶部
首页 > 资讯 > 数据库 >【MySQL实战】索引
  • 620
分享到

【MySQL实战】索引

【MySQL实战】索引 2014-12-06 22:12:52 620人浏览 绘本
摘要

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

【MySQL实战】索引

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。

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

主键索引与普通索引的区别在于,主键索引不需要回表遍历,普通索引在普通索引拿到索引值后,需要根据主键值再去主键索引遍历一次,称为回表。

    InnoDB所有的数据文件idb文件每页的大小是16K,操作系统文件系统块是4K,磁盘扇区是512字节,页可以存放数据或者指针,每个表的索引页所在页存储在表空间信息中,通常索引节点由键值+指针地址组成,默认指针大小是6字节(2^48bit),自增主键bigint大小是8字节(2^64bit),所以bigint的索引节点(非叶子节点)大小为14字节,16K的页可以存储16384/14=1170条数据的索引,由于是主键索引,叶子节点存放着数据记录,假设每条数据记录大小为1k,每页叶子节点可存放16条记录,索引树B+树会分为两层,树高为2时,该课树可最多存放记录数1170*16=18720条数据;树高为3时,可存放最多记录数为1170*1170*16=21902400条记录,上千万级别了。结合通常说的单表数据超过千万时(单表1G),索引页数、数据页数会很大,需要考虑拆表、拆库,甚至改用其他数据库,如HBase、MyCat、Greenplum、Redis,应该也是磁盘io瓶颈所致,所以Mysql的在B+树索引的索引方式下还是无法绕过磁盘IO的问题。

    参考《mysql b+树能存多少条数据?b+树每层有多少分支》https://blog.csdn.net/csdnlijingran/article/details/102309593

在这里插入图片描述

在这里插入图片描述    

索引维护

    当索引页数据部署顺序时,需要从中间插入、删除索引节点时,需要移动索引数据,特别是数据处于索引页临界点时,会造成索引页分裂成N+1张,或者合并成N-1张。

    所以主键ID建议使用自增长,可以避免一部分这样的问题,而且可以带来一部分其他的收益,主键为自增长的bigint,占据的空间为8字节,比自定义的UUID32、64位都要小,这样普通索引的叶子节点占据的空间就会更小,这样就可以节省普通索引的空间。

    联合索引

        根据索引顺序,逐个索引过滤满足条件的数据,直到所有索引筛选完成,如有index(A,B,C),假设命中了联合索引(A,B,C),先用A索引的全部记录与条件组筛选得出满足条件A的索引树(A,B,C)的子集合A,逐行回表到主键索引获取数据,得到数据集合A;再拿B的条件与索引树(A,B,C)的子集合A中B字段索引做运算,得到满足A+B条件的索引树(A,B,C)的子集合AB,逐行回表到主键索引树上拿到数据集合A+B;再拿C的条件与索引树(A,B,C)的自己和AB中的C字段索引做运算,得到满足A+B+C条件的索引树(A,B,C)的索引子集ABC,再逐行回表到主键索引中获取数据,得到数据集合ABC,返回查询结果ABC。

    从上述过程可以看出需要多次回表,且存在重复回表的记录,与其这样,不如在可以通过索引包含的字段先做判断筛选,减少回表的次数,在Mysql5.6及其以后的版本有这样的能力,中称作索引下沉/索引下推(index condition pushdown)

    存在like > < 的判断时根据索引最左前缀匹配原则,最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

    覆盖索引是指需要查询的数据字段包含在索引的叶子节点上,不需要再到数据页上获取数据,减少树的搜索和IO。

普通索引与唯一索引的区别

    在查询上对于命中索引的查询来说,唯一索引在取得满足条件的时候会结束搜索,普通索引还需要继续往下搜索查找和判断下一条记录,但是由于InnoDB的数据是按页为单位存储的,当索引指向的数据需要被读到时,会整页读入内存,对内存的查找和判断还是比较快的,特别是一页只有16K大小的情况;当然如果存在跨页的情况就会复杂一些,主键索引的优势会明显多一些。

    在更新时主键索引需要做唯一性检查,change buffer的情况相对较好,但是如果数据不在内存中,可能导致磁盘IO严重,普通索引则不存在这种情况。

您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL实战】索引

本文链接: https://www.lsjlt.com/news/7011.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【MySQL实战】索引
    主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。...
    99+
    2014-12-06
    【MySQL实战】索引
  • MongoDB实战(7)索引与性能
    一、索引MongoDB提供了多样性的索引支持索引信息被保存在system.indexes中且默认总是为_id创建索引。1、基础索引在字段age上创建索引1(升序);-1(降序)上例显示出来的一共有2个索引其...
    99+
    2022-10-18
  • MySQL索引:B+树索引
    MySQL索引:B+树索引 B+树索引是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。B+树索引的构造类似于二叉树,根据键值快速找到数据 B树 B+树是由B树演化而来的,在了解B+树之前,我们需要对B树有一点认...
    99+
    2021-09-01
    MySQL索引:B+树索引
  • [MySQL]MySQL索引
    [MySQL]MySQL索引 文章目录 [MySQL]MySQL索引1. 索引的概念2. 认识磁盘磁盘的内部结构磁盘中的一个盘片结构定位扇区磁盘随机访问与连续访问 3. MySQL与磁盘交互的基本单位4. 建立共识5. 索引的...
    99+
    2023-08-17
    mysql 数据库 linux centos 阿里云
  • mysql索引(覆盖索引,联合索引,索引下推)
    目录什么是索引?索引的实现方式innodb的索引模型索引维护覆盖索引联合索引索引下推什么是索引? 当我们使用汉语字典查找某个字时,我们会先通过拼音目录查到那个字所在的页码,然后直接翻到字典的那一页,找到我们要查的字,通过...
    99+
    2022-08-25
  • Mysql 索引
      所谓聚簇索引,就是将索引和数据放到一起,找到索引也就找到了数据,B+树索引就是一种聚簇索引, 而非聚簇索引就是将数据和索引分开,查找时需要先查找到索引,然后通过索引回表找到相应的数据。 InnoDB有且只有一个聚簇索引,而MyISAM中...
    99+
    2018-06-24
    Mysql 索引
  • MySQL 索引
      索引的概念 不使用索引,要操作某些行时,需要遍历遍历整张表来找到匹配的行,很花时间,且有点耗资源。 书:目录=>快速定位到指定章节,不用一页一页地找 数据库:索引=>快速定位到指定记录,不用遍历数据表去找,索引相当于数据表的目...
    99+
    2018-11-30
    MySQL 索引
  • Mysql-索引
    先创建表 mysql> CREATE TABLE test( -> id INT, -> username VARCHAR(16), -> city VARCHAR(16), -> ...
    99+
    2014-05-24
    Mysql-索引
  • MySQL索引
    什么是索引? 排好序快速查找的数据结构就是索引 索引作用 提高检索效率,降低数据库对IO成本;降低数据排序,减少cpu消耗 索引类型 单值索引:一个索引包含单个列,一个表可以有多个单值索引 唯一索引:索引值必须唯一,但允许有空值 复合索引:...
    99+
    2015-09-15
    MySQL索引 数据库入门 数据库基础教程
  • mysql的联合索引(复合索引)的实现
    联合索引 本文中联合索引的定义为(MySQL): ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`); 联合索引的优点 若多个一条SQL,需要多个...
    99+
    2022-05-29
    mysql 联合索引 mysql 复合索引
  • Python实战之手写一个搜索引擎
    目录一、前言二、工作流程三、数据模块四、索引模块五、搜索模块一、前言 这篇文章,我们将会尝试从零搭建一个简单的新闻搜索引擎 当然,一个完整的搜索引擎十分复杂,这里我们只介绍其中最为核...
    99+
    2022-11-12
  • MySQL主键索引和非主键索引的实现
    目录主键索引(Primary Key Index):非主键索引(Secondary Index):在mysql中,主键索引和非主键索引有不同的作用和特点: 主键索引(Primary Key Index): 主键索引是一种...
    99+
    2023-10-27
    MySQL 主键索引 MySQL 非主键索引
  • MySQL索引篇
    目录 MySQL索引一、怎么知道一条SQL语句有没有使用索引?二、如何排查慢查询三、索引失效以及为什么失效四、索引为什么能提高查询性能五、为何选择B+树而不是B树六、索引分类七、什么时候创建以及什么时候不需要索引八、索引优化 ...
    99+
    2023-08-19
    mysql 数据库 mybatis
  • mysql的索引
    什么是索引 帮助Mysql高效获取数据的数据结构 索引就是数据结构 类似新华字典的索引目录,可以通过索引目录快速查到你想要的字 排好序的快速查找数据 为什么要建立索引 提高查询效率 没有排序之前一个一个往后找 通过索引...
    99+
    2018-07-12
    mysql的索引
  • mysql之索引
      哪些情况需要创建索引 主键自动建立唯一索引 频繁作为查询条件的字段应该创建索引(where 后面的语句) 查询中与其它表关联的字段,外键关系建立索引 单键/组合...
    99+
    2016-10-12
    mysql之索引
  • mysql hash索引
       今天研究下mysql中索引,首先我应该知道的是,mysql中不同存储引擎的索引工作方式不一样,并且不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,...
    99+
    2022-10-18
  • 八、MySQL索引
     索引用于快速找到某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始读完整个表,直到找到相关的行。表越大,查询所花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达某个...
    99+
    2022-10-18
  • MySQL存储引擎--------Federated最佳实战
    1. 背景   * 本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现.   * 有点类似Oracle中的数据库链接(DBL...
    99+
    2022-10-18
  • MySQL---单列索引(包括普通索引、唯一索引、主键索引)、组合索引、全文索引。
    1. 索引 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索 引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的 时间就越多,如果表中查询的列有一个索引,MySQL...
    99+
    2023-09-21
    数据库 mysql sql
  • MySQL索引怎么实现分页探索
    这篇文章主要讲解了“MySQL索引怎么实现分页探索”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引怎么实现分页探索”吧!MySQL索引优化之分页探索表结构CREATE ...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作