阅读mysql索引文档
This commit is contained in:
@@ -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
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user