阅读mysql索引文档

This commit is contained in:
asahi
2025-02-15 16:28:43 +08:00
parent f657d2e2ed
commit ed5f2297cf
2 changed files with 382 additions and 1 deletions

View File

@@ -1,3 +1,57 @@
- [](#表)
- [索引组织表](#索引组织表)
- [innodb逻辑存储结构](#innodb逻辑存储结构)
- [表空间](#表空间)
- [innodb\_file\_per\_table](#innodb_file_per_table)
- [segment](#段segment)
- [Extent](#区extent)
- [Page](#页page)
- [](#行)
- [innodb行记录格式](#innodb行记录格式)
- [Compact](#compact)
- [变长字段长度列表](#变长字段长度列表)
- [NULL标志位](#null标志位)
- [记录头信息](#记录头信息)
- [行溢出数据](#行溢出数据)
- [dynamic](#dynamic)
- [char存储结构](#char存储结构)
- [innodb数据页结构](#innodb数据页结构)
- [File Header](#file-header)
- [Infimum和Supremum record](#infimum和supremum-record)
- [user record 和 free space](#user-record-和-free-space)
- [page directory](#page-directory)
- [B+树索引](#b树索引)
- [File Trailer](#file-trailer)
- [完整性校验](#完整性校验)
- [分区表](#分区表)
- [partition keys \& primary keys \& unique keys](#partition-keys--primary-keys--unique-keys)
- [表中不存在唯一索引](#表中不存在唯一索引)
- [后续向分区表添加唯一索引](#后续向分区表添加唯一索引)
- [对非分区表进行分区](#对非分区表进行分区)
- [分区类型](#分区类型)
- [RANGE](#range)
- [information\_schema.partitions](#information_schemapartitions)
- [看select语句查询了哪些分区](#看select语句查询了哪些分区)
- [插入超过分区范围的数据](#插入超过分区范围的数据)
- [向分区表中添加分区](#向分区表中添加分区)
- [向分区表中删除分区](#向分区表中删除分区)
- [LIST](#list)
- [HASH](#hash)
- [新增HASH分区](#新增hash分区)
- [减少HASH分区](#减少hash分区)
- [LINEAR HASH](#linear-hash)
- [KEY \& LINEAR KEY](#key--linear-key)
- [COLUMNS](#columns)
- [range columns](#range-columns)
- [list columns](#list-columns)
- [子分区](#子分区)
- [分区中的NULL值](#分区中的null值)
- [分区和性能](#分区和性能)
- [不分区](#不分区)
- [按id进行分区](#按id进行分区)
- [在表和分区之间交换数据](#在表和分区之间交换数据)
# 表
## 索引组织表
innodb存储引擎中表都是根据主键顺序组织存放的这种存储方式被称为索引组织表index organized table。在innodb存储引擎表中每张表都有主键primary key如果在创建表时没有显式指定主键那么innodb会按照如下方式创建主键
@@ -638,4 +692,22 @@ mysql允许对null值做分区但`mysql数据库中的分区总是视null值
- 对于按`code`进行查找的语句`select * from t where code = xxx`
- 对于按code进行查找的语句需要扫描所有的10个分区每个分区大概需要2次磁盘io故而总共的磁盘io大约为20次
> 在使用分区表时应尽量小心不正确的使用分区将可能会带来大量的io造成性能瓶颈
> 在使用分区表时应尽量小心不正确的使用分区将可能会带来大量的io造成性能瓶颈
### 在表和分区之间交换数据
mysql支持在表分区和非分区表之间交换数据
- 在非分区表为空的场景下,相当于将分区中的数据移动到非分区表中
- 在表分区为空的场景下,相当于将非分区表中的数据移动到表分区中
在表和分区之间交换数据,可以通过`alter table ... exchange partition`语句,且必须满足如下条件:
- 要交换的非分区表和分区表必须要拥有相同的结构,但是,非分区表中不能够含有分区
- 非分区表中的数据都要位于表分区的范围内
- 被交换的表中不能含有外键,或是其他表含有被交换表的外键引用
- 用户需要拥有`alter, insert, create, drop`权限
- 使用`alter table ... exchange parition`语句时,不会触发交换表和被交换表上的触发器
- `auto_increment`将会被重置
`exchange partition ... with table`的示例如下:
```sql
alter table p_range_columns_t exchange partition p_2024 with table np_t
```