我们有一个像这样的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)
答案 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