如何使用大量 ram (128 GB) 來改進 MySQL 5.5 索引創建?
這與我的另一篇文章類似,但現在我有一個不同的表結構,並且仍然不清楚應該更改哪些 MySQL 參數以利用我的機器擁有的額外記憶體 — 所以如果它看起來像重複,讓我知道如何最好地改寫我要問的內容。
我有下表:
create table mytable (id1 int, id2 int, score float) engine MyISAM,
有 500 億條記錄。我計劃在第一列
alter table mytable add index myindex (id1)
(注意:引擎類型不需要是 MyISAM,如果有區別的話。
您首先關心的是數據載入。由於您不打算擁有一個主鍵,而只是一個索引,因此您應該在按任何 UNIX 風格的索引列 id1 載入數據之前對數據進行排序:
sort -n mytable.txt > mytable.sort
要載入數據,請在 MySQL 提示符下使用 LOAD DATA 的 mysqlimport。為了加快載入速度,MYISAM 表受益於增加 bulk_insert_buffer_size、myisam_sort_buffer_size 或 key_buffer_size,對於 INNODB 表,增加 innodb_buffer_pool_size 和 innodb_log_file_size。
這些增加可能還不夠,隨著記憶體填滿,載入仍然可能會減慢。在這種情況下,以塊的形式載入數據效率更高。您可以通過在 mysql 根目錄中執行每小時 du 來監控速度:
#!/bin/bash while [ 1 ] do du -hs database/. sleep 3600 done
僅出於完整性考慮(與此特定情況無關):禁用索引也有助於加快載入過程。
現在查詢:這有點複雜,因為它取決於您的數據以及您想要查詢表的方式。影響性能的最大因素是:
- 緩衝區:由變數設置。執行您的典型查詢並比較“顯示變數”和“顯示狀態”輸出以確定瓶頸。
- 索引:你已經介紹過了
- 聯接:根據您與其他表聯接的方式,
以數據倉庫樣式對錶進行非規範化可能會更好,
特別是如果您想聯接兩個大表。
關於數據載入和大表查詢優化的精彩文章可以在以下網址找到: http ://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/ http://www .mysqlperformanceblog.com/2006/06/09/why-mysql-could-be-slow-with-large-tables/
查看這些和其他變數的預設值和允許值:http: //dev.mysql.com/doc/refman/5.5/en/server-system-variables.html