[英]mysql how to index a column right?
我有一张看起来像的桌子:
ID | 评论编号 | 创建日期 | 文本内容 | parent_id | 完全的 | 父案例编号 | parent_database_id |
---|---|---|---|---|---|---|---|
23244 | 55a3200000jm4Y1AAI | 2015-10-27 18:26:37 | 很长的文字 | 5088200005o0G6sAAE | 1个 | 1000005 | 4个 |
我正在尝试通过这样的查询来填充表格:
UPDATE case_base.comment
SET parent_case_database_id = '4' ,
parent_case_num = '3242'
WHERE parent_id = '5088200005o0G6sAAE';
完成此查询大约需要 9 秒。 问题是我需要更新 6 000 000 行这样的行。
可能需要将近 2 年的时间才能完成。
是否可以添加任何索引或以某种方式加快这一切?
需要考虑的一些事项:
如果可能的话,你应该定义你的parent_id
列来包含COLLATE 'ascii_bin'
,就像这样。
parent_id CHAR(18) NOT NULL COLLATE 'latin1_bin'
如果像'5088200005o0G6sAAE'
这样的parent_id
值不能确定像您的示例中那样长 18 个字符,则可以改用VARCHAR(something)
。
latin1_bin
归类意味着该列的值将作为区分大小写的 8 位字符进行存储和比较。 这使得列和索引更紧凑,因此速度稍快。 (如今 MySQL 和 MariaDB 中的默认值类似于utf8mb4_general_ci
,它不区分大小写,索引中每个字符占用 32 位。)
另外,你的例子中有小写字符,所以在使用不区分大小写的排序规则之前你应该三思而后行......它可能会导致你的WHERE parent_id = '5088200005o0G6sAAE'
过滤器命中比你预期的更多的行。
不需要多国字符的其他列也应该使用该latin1_bin
排序规则。 您的text_content
列可能确实需要多国字符。
该索引将加速您的 UPDATE 查询。 有效的排序规则将被烘焙到索引中。
CREATE INDEX parent_id ON your_table (parent_id);
如果你在交易批次中进行更新,一次可能是一百个左右,事情会更快 go 。 像这样的东西。
START TRANSACTION; UPDATE whatever; UPDATE whatever; ... 98 more... COMMIT; START TRANSACTION; ... 100 more... COMMIT; ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.