MySQL中的分区表

时间:2017-01-17 16:50:14

标签: mysql hash database-partitioning

我们有一个像这样的MySQL表(table_ha):

SELECT * FROM table_ha (SELECT 1 AS hash_loc UNION ALL SELECT 28700 UNION ALL SELECT 28728 ... UNION ALL SELECT 28680 UNION ALL SELECT 28694) AS T1 ON table_ha.hash_loc = T1.hash_loc'

我们不断执行以下查询:

UNION ALL SELECT X

我们必须假设查询中可能有数千个数字(包含在rowValue = $(".mergeSelect").val(); 中)。当table_ha中的行数不高时,它可以正常工作。现在,想象有数千万行。然后它变得非常慢。

你知道分区是否可以在这样的情况下工作?如何将其应用于现在的表格?你现在还有其他替代方案吗?

注意:hashloc是BigInt(32),hash_val是BigInt(64)

1 个答案:

答案 0 :(得分:1)

在这种情况下,我不认为需要分区。我建议您确保在table_ha.hash_loc上有索引。

我不确定为什么将子查询与UNION一起使用而不是仅使用IN()谓词:

SELECT * FROM table_ha 
WHERE hash_loc IN (1, 28700, 28728 ... 28680, 28694);

顺便说一下,BIGINT(32)BIGINT(64)相同。请参阅我对Types in MySQL: BigInt(20) vs Int(20)

的回答

重新评论:

分区仅在您搜索用于分区键的列时有帮助。而且您只能以一种方式对给定表进行分区。索引通常更有用,因为您可以为每个表创建多个索引。

我使用数亿行的表,索引有很多帮助。但必须仔细设计索引以匹配您要优化的每个特定查询。

您可能会喜欢我的演示文稿How to Design Indexes, Really。我还有一段视频:https://www.youtube.com/watch?v=ELR7-RdU9XU