MySQL 中的分区表

Partition tables in MySQL

我们有这样一个 MySQL table (table_ha):

Name = table_ha
+----------+------------------+
| hash_loc |     hash_val     |
+----------+------------------+
|  242342  | 9606075000001005 |
+----------+------------------+
|  431231  | 9606075000005208 |
+----------+------------------+
|  342344  | 7645345456745536 |
+----------+------------------+
|  324254  | 7656453453465788 |
+----------+------------------+
|  656456  | 9788674534546766 |
+----------+------------------+
|  674453  | 3458752778456834 |
+----------+------------------+
|   ...    |       ...        |
+----------+------------------+
|  765874  | 8796634586346785 |
+----------+------------------+
|  864534  | 9834667054534588 |
+----------+------------------+

我们不断执行如下查询:

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 中)。当table_ha行数不高时,可以正常工作。现在,想象一下有几亿行。然后就变得很慢了。

您知道在这种情况下分区是否可行吗?如何将其应用于现在 table?您现在还有其他选择吗?

注意:hashloc 是一个 BigInt(32) 而 hash_val 是一个 BigInt(64)

我认为在这种情况下不需要分区。我建议确保您在 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)

的回答

回复您的评论:

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

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

你可能会喜欢我的介绍How to Design Indexes, Really. Also there's a video of me presenting it: https://www.youtube.com/watch?v=ELR7-RdU9XU