gpt4 book ai didi

mysql - MySQL 中的分区表

转载 作者:行者123 更新时间:2023-11-28 23:20:46 25 4
gpt4 key购买 nike

我们有一个像这样的 MySQL 表 (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的行数不高时,可以正常工作。现在,想象一下有几亿行。然后它变得很慢。

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

注意: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) 的回答


回复你的评论:

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

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

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

关于mysql - MySQL 中的分区表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41702639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com