专栏首页JMCuiMySQL 聚集索引和二级索引

MySQL 聚集索引和二级索引

Clustered and Secondary Indexes(聚集索引和二级索引)

Every InnoDB table has a special index called the clustered index where the data for the rows is stored. Typically, the clustered index is synonymous with the primary key. To get the best performance from queries, inserts, and other database operations, you must understand how InnoDB uses the clustered index to optimize the most common lookup and DML operations for each table.

每张使用 InnoDB 作为存储引擎的表都有一个特殊的索引称为聚集索引,它保存着每一行的数据,通常,聚集索引就是主键索引。为了得到更高效的查询、插入以及其他的数据库操作的性能,你必须理解 InnoDB 引擎是如何使用聚集索引来优化常见的查找和 DML 操作。

  • When you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index. Define a primary key for each table that you create. If there is no logical unique and non-null column or set of columns, add a new auto-increment column, whose values are filled in automatically. 如果你的表定义了一个主键,InnoDB 就使用它作为聚集索引。因此,尽可能的为你的表定义一个主键,如果实在没有一个数据列是唯一且非空的可以作为主键列,建议添加一个自动递增列作为主键列。
  • If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the key columns are NOT NULL and InnoDB uses it as the clustered index. 如果你的表没有定义主键,InnoDB 会选择第一个唯一非空索引来作为聚集索引。
  • If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index named GEN_CLUST_INDEX on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order. 如果你的表既没有主键,又没有合适的唯一索引,InnoDB 内部会生成一个隐式聚集索引 —— GEN_CLUST_INDEX,该索引建立在由 rowid 组成的合成列上。数据行根据 InnoDB 分配的 rowid 排序,rowid 是一个 6 字节的字段,随着数据插入而单调递增。也就是说,数据行根据 rowid 排序实际上是根据插入顺序排序。

How the Clustered Index Speeds Up Queries(聚集索引如何提升查询效率)

Accessing a row through the clustered index is fast because the index search leads directly to the page with all the row data. If a table is large, the clustered index architecture often saves a disk I/O operation when compared to storage organizations that store row data using a different page from the index record. 通过聚集索引来访问一行数据是非常快的,这是因为所有的行数据和索引在同一页上。如果表特别大,相较于行数据和索引在不同页上存储结构(比如 myisam 引擎),这将大大节省磁盘 I/O 资源。

How Secondary Indexes Relate to the Clustered Index(二级索引和聚集索引如何关联)

All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index. 除了聚集索引外的其他索引类型都属于二级索引。在 InnoDB 中,二级索引中的每个记录都包含该行的主键列,以及二级索引指定的列;聚集索引中,InnoDB 通过主键值来查询数据行。

If the primary key is long, the secondary indexes use more space, so it is advantageous to have a short primary key. 如果主键过长,二级索引就需要更大的空间,因此,使用短的主键列是很有利的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Spring的RPC通讯模型.

    JMCui
  • Netty 系列二(传输).

        上一篇文章我们提到 Netty 的核心组件是 Channel、回调、Future、ChannelHandler、EventLoop,这篇文章主要是对 C...

    JMCui
  • MySQL 的全文索引.

    通过 前面的文章 我们了解到 B+ 树索引具有"最左前缀匹配"的特性,因此,对于以下查询 B+ 树索引能很好的适配。

    JMCui
  • 2019-2020 ICPC Southeastern European Regional Programming Contest (SEERC 2019)-G.Projection

    Everybody knows that you are a TensorFlow fan. Therefore, you’ve been challenged...

    某些人
  • TCP:测试小工具TCPing

    将下载的 EXE 程序放到 C:\Windows\System32 文件夹下,即可在 cmd 中使用 tcping 命令。

    弄啥嘞
  • 简单的实现土味实时声音可视化

    声音可视化顾名思义,就是把听到声音,通过视觉的方法呈现出来,人不仅可以听见声音,同时也可以看见。声音可视化最早是人们用来分析和了解声音的一种研究方式,不...

    UDM Lab
  • 【CodeForces 602C】H - Approximating a Constant Range(dijk)

    In Absurdistan, there are n towns (numbered 1 through n) and m bidirectional rai...

    饶文津
  • Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)

    A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes...

    Angel_Kitty
  • IOS5开发-控件位置适应屏幕旋转代码

    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation  ...

    阿新
  • 聊聊flink StreamOperator的initializeState方法

    本文主要研究一下flink StreamOperator的initializeState方法

    codecraft

扫码关注云+社区

领取腾讯云代金券