簡體   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