名词解释
clustered index(聚集索引)
对 (primary key) 主键索引的一种表述 InnoDB 表存储是基于 primary key 列来组织的, 这样做可以加快查询和排序速度为了获得最好的性能, 在选择 primary key columns 的时候要特别小心因为修改 clustered index(聚集索引)列是一个昂贵的操作, 所以选择作为 primary 的列通常都是很少或者从不会被更新的列
primary key(主键)
A set of columns(一组列), 可以唯一标识表中的每一行因此, 它必须是一个 unique index, 并且不允许有 NULL 值
InnoDB organizes the table storage based on the column values of the primary key.
secondary index(辅助索引或二级索引)
索引的一种类型一个 InnoDB 表可以有 0 个或者多个 secondary index
B-tree
tree 数据结构在数据库索引中被广泛采用这种结构总是有序的可以快速查找, 精确匹配 (等于) 或者范围匹配 (比如, 大于小于 BETWEEN 等操作) 大多数的存储引擎都是使用的这种结构, 比如 InnoDB 和 MyISAM
因为 B-tree 节点可以有许多孩子, 一个 B-tree 和二叉树不一样, 二叉树它限制每个结点只能 2 个孩子
聚集索引和辅助索引
每个 InnoDB 表都有一个特别的索引叫 clustered index 通常, clustered index 和 primary key 是一个意思
为了在查询插入以及数据库的其它操作时获得最好的性能, 你必须理解 InnoDB 中是怎样使用 clustered index 优化大多数查询的
当你在表中定义了一个 PRIMARY KEY 的时候, InnoDB 会把它作为 clustered index 在你创建每一张表的时候最好定义一个 primary key, 如果实在没有一个或者一组逻辑唯一并且非空的列, 你就添加一个新的 auto-increment(自增长)的列, 让它的值自动填充
如果你没有在你的表中定义 PRIMARY KEY, 那么 MySQL 将查找第一个所有值非空的唯一索引列作为 clustered index
如果表中没有 PRIMARY KEY, 而且也没有合适的 UNIQUE index, 那么 InnoDB 内部将生产一个名字叫 GEN_CLUST_INDEX 的隐藏 clustered index, 其值为行 ID
Clustered Index 是如何加速查询的
通过 clustered index 来访问一行是非常快的, 因为索引检索直接指向数据所在的页如果一个表很大, clustered index 架构通常会节省 I/O 操作
Secondary Indexes 是如何关联到 Clustered Index 的
除了 clustered index 之外的其它索引都叫 Secondary Indexes 在 secondary index 中的每一条记录包含那一行的 primary key 列 InnoDB 用这个 primary key 的值来检索聚集索引中的行
如果 primary key 很长, 那么 secondary indexes 将会占用更多的空间, 因此用一个简短的 primary key 是有好处的
一个 InnoDB 索引的物理结构
InnoDB indexes are B-tree data structures. Index records are stored in the leaf pages of their B-tree data structure. The default size of an index page is 16KB.
当一条新记录被插入到 InnoDB clustered index 中时, InnoDB 预留 page(页)的 1/16 的空间以备将来插入或者更新索引记录如果索引记录是顺序插入的(升序或者降序), 那么填满这一页就是剩下的那 15/16 的空间; 如果记录是按照随机顺序插入的, 那么填满这一条就是 1/2 到 15/16 页配置项 innodb_fill_factor 定义每个 B-tree page 百分之多少的空间用于存储有序的索引记录, 剩下的空间是为以后索引增长而预留的
你可以通过 innodb_page_size 设置 InnoDB 表空间的 page size 支持 64KB, 32KB, 16KB (default), 8KB, and 4KB.
小结
1 如果表中没有定义 primary key, 则查找第一个不为空的唯一索引列作为聚集索引, 若找不到, 则生成一个隐藏的聚集索引
2 插入新记录的时候, 预留一页的 1/16 的空间用于以后的插入或更新
参考 https://dev.mysql.com/doc/refman/5.7/en/innodb-indexes.html
来源: https://www.cnblogs.com/cjsblog/p/8447325.html