mysql 分区性能下降

MySql 码拜 9年前 (2015-11-25) 2067次浏览
把一个表按公司的ID分成1000个区(本地一个磁盘上,InnoDB引擎),
测试数据大约800W。
测试的时候发现,
(1) 执行 SELECT COUNT(*) 或group by 等理论上分区会更快的查询,速度却慢了将近1倍
(2) 执行 查询条件中没有带公司ID的语句,速度也更慢了。
以上原因是为啥呢?
第一个是原因是磁盘IO问题吗?1000个分区相似1000个并发,IO卡住了?
第二个呢?分区就会有这个问题吗?
求高手指点!万分感激
解决方案: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)
[1034331897@qq.com]
分享 (0)