繁体   English   中英

mysql 如何索引一个列?

[英]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 年的时间才能完成。

是否可以添加任何索引或以某种方式加快这一切?

需要考虑的一些事项:

  1. 如果可能的话,你应该定义你的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列可能确实需要多国字符。

  1. 该索引将加速您的 UPDATE 查询。 有效的排序规则将被烘焙到索引中。

     CREATE INDEX parent_id ON your_table (parent_id);
  2. 如果你在交易批次中进行更新,一次可能是一百个左右,事情会更快 go 。 像这样的东西。

     START TRANSACTION; UPDATE whatever; UPDATE whatever; ... 98 more... COMMIT; START TRANSACTION; ... 100 more... COMMIT; ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM