From f657d2e2ed240ee9dfd09ab6f11ae1596ba24614 Mon Sep 17 00:00:00 2001 From: asahi Date: Mon, 10 Feb 2025 12:59:53 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBmysql=E5=88=86=E5=8C=BA?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_表.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mysql/mysql文档/mysql_表.md b/mysql/mysql文档/mysql_表.md index 4545c0a..a4971d2 100644 --- a/mysql/mysql文档/mysql_表.md +++ b/mysql/mysql文档/mysql_表.md @@ -614,3 +614,28 @@ select partition_name, partition_method, subpartition_name, subpartition_method | p\_beijing | LIST COLUMNS | p\_beijingsp1 | KEY | | p\_beijing | LIST COLUMNS | p\_beijingsp2 | KEY | +### 分区中的NULL值 +mysql允许对null值做分区,但`mysql数据库中的分区总是视null值小于任何非null的值`,该逻辑`和order by处理null值的逻辑一致`。 + +故而,在使用不同的分区类型时,对于null值的处理逻辑如下: +- 对于range类型分区,当插入null值时,其会被放在最左侧的分区中 +- 对于list类型的分区,如果要插入null值,必须在分区的`values in (...)`表达式中指定null值,否则插入语句将会报错 +- hash和key的分区类型,将会将null值当作`0`来散列 + +### 分区和性能 +对于OLTP类型的应用,使用分区表时应该相当小心,因为分区表可能会带来严重的性能问题。 + +例如,对于包含1000w条数据的表`t`,如果包含主键索引`id`和非主键索引`code`,分区和不分区,其性能分析如下 + +#### 不分区 +如果不对表t进行分区,那么根据`id`(唯一主键索引)或`code`(非unique索引)进行查询,例如`select * from t where id = xxx`或`select * from t where code = xxx`时,可能只会进行2~3次磁盘io(1000w数据构成的B+树其层高为2~3)。 + +#### 按id进行分区 +如果对表`t`按照`id`进行`hash`分区,分为10个分区,那么: +- 对于按`id`进行查找的语句`select * from t where id = xxx` + - 将t按id分为10个区后,如果分区均匀,那么每个分区数据大概为100w,对分区的查询开销大概为2次磁盘io + - 根据`id`的查询只会在一个分区内进行查找,故而磁盘io会从3次减少为2次,可以提升查询效率 +- 对于按`code`进行查找的语句`select * from t where code = xxx` + - 对于按code进行查找的语句,需要扫描所有的10个分区,每个分区大概需要2次磁盘io,故而总共的磁盘io大约为20次 + +> 在使用分区表时,应尽量小心,不正确的使用分区将可能会带来大量的io,造成性能瓶颈 \ No newline at end of file