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
我们有这样一个 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