【发布时间】:2015-09-14 07:19:19
【问题描述】:
我有一张表,其中包含大约 3 亿条记录(仅 60 天)。表结构很简单..
它有 12 列,其中 4 列已编入索引:
LogTime - DateTime
RegionID - Integer
ProvinceID - Integer
CityID - Integer
还有一个唯一索引:
UNIQUE INDEX UI_IDX (`LogTime`, `RegionID`, `ProvinceID`, `CityID`);
其余字段只是主要由查询结果获取的值。
数据库服务器已经调好,状况良好(~12GB 用于缓冲空间等)
好吧,为了加快查询速度,我决定在LogTime 字段上对表进行分区。我通过使用PARTITION BY RANGE 对表进行分区来实现这个目标。现在我的表有 365 个分区(1 个分区 1 天,每个分区 500 万条记录)。
问题是我们对查询性能不满意,我一直在寻找一种方法将分区分解为更小的部分.. 假设在 LogTime 和 RegionID 上对表进行分区...我不确定如果它适用于子分区...
【问题讨论】:
-
分区本质上不提供任何性能。请向我们展示您需要更好性能的实际查询。索引和分区必须基于查询。
-
不要使用超过50个左右的分区;事情变慢了。更多关于分区:mysql.rjweb.org/doc.php/partitionmaint
-
嗨瑞克,感谢您的回复。这是我的示例查询之一,需要几分钟才能反馈结果:
select b.CityName, a.val1, a.val2 from DataRepo a left join City b on a.CityID = b.CityID where (a.LogTime >= '2015-08-01 00:00:00' and a.LogTime <= '2015-08-05 00:00:00') and a.RegionID = 1 and a.ProvinceID = 14;
标签: mysql database innodb database-partitioning