[英]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.