mysql 分区性能下降

MySql 在路上 470次浏览
把一个表按公司的ID分成1000个区(本地一个磁盘上,InnoDB引擎),
测试数据大约800W。
测试的时候发现,
(1) 执行 SELECT COUNT(*) 或group by 等理论上分区会更快的查询,速度却慢了将近1倍
(2) 执行 查询条件中没有带公司ID的语句,速度也更慢了。
以上原因是为啥呢?
第一个是原因是磁盘IO问题吗?1000个分区相似1000个并发,IO卡住了?
第二个呢?分区就会有这个问题吗?
求高手指点!万分感激
解决方案

1

InnoDB引擎是聚簇索引加上非聚集索引。
第一个是原因是磁盘IO问题吗?1000个分区相似1000个并发,IO卡住了?
分区之后,你假如是求范围值,会在不同的分区里查找,所以比单个表慢,假如你的数值在一个分区里,就会快了
第二个呢?分区就会有这个问题吗?
原因是公司ID应该是主键是聚簇索引,所以会快点,假如没有使用主键索引则mysql会在找到了这个值所在的主键值然后重新走一遍聚簇索引来获得数值,再加上分区就又要查找几个分区数据。所以更慢

1

以文本方式贴出
explain select …
show index from ..
以供分析。

20

首先你要明白分区的特点是什么,然后再去根据实际情况来运用:
1. 提高可用性。某个分区损坏,不会导致整个表不能进行select、
2、提高可维护性。你可以对单个分区进行维护,而不会影响其他分区。特别是在加载数据,删除数据的时候。
3、提高IO的并发性。原来是1个硬盘,现在假如你有10个分区,分别放到10个物理硬盘上,那么当你查询多个分区时,可以同时启动多个物理硬盘,极大的提高查询速度。假如你还是单个硬盘,就没什么效果。
4、分区消除。就是加快sql的查询速度,但只限于查询1、2个分区的时候,假如你要查 全部分区,速度会比单个表更慢,当然假如是由N个硬盘,速度还是会快的。
另外,分区也会降低性能,例如每个语句要先解析判断查询条件是针对那个分区,这个需要读取系统表的元数据,当你有大量并发请求时,整个系统表就成了瓶颈,大家都等待。
综上所述,你应该知道你的那个问题的原因。

8

先纠正一个误区,分区一定会提高查询性能,某种程度来说,是错的。
1000个分区并不是1000个并发,而是一个,单块盘io就那么大,分区真正想提升,分区放置在不同的盘符。
更主要的,假如没有用到分区键,大部分情况,就是会变慢。需要增加判断,索引树也被切割,正常。
只有在用到分区键的时候,才能勉强提升速度。

4

LZ你好
你的问题是肯定的。
分区表是一种粗粒度,简易的索引策略,适用于大数据的过滤场景.最适合的场景是,没有合适的索引时,对其中几个分区表进行全表扫描.或只有一个分区表和索引是热点,而且这个分区和索引能够全部存储在内存中。
限制单表分区数不要超过150个,并且注意某些导致无法做分区过滤的细节,分区表对于单条记录的查询没有优势。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql 分区性能下降
喜欢 (0)or分享 (0)