有一個表有上千W數據, 用什么方法給這個表加一個字段最快?
1. alert
2. 建一個表和第一個表一樣,只是多了要加的字段,然后用多個INSERT INTO SELECT語句limit寫入
3. 就是導出多個文件,然后用loadfile
4. 其它?
試過2.5KW數據, alert要156m。
INSERT INTO SELECT 100W要5m46s
兩個工具選擇:
http://www.percona.com/software/percona-toolkit
http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
第二個工具是比較好的選擇,可以線上改表結構,試試再給報告給大家
正在使用第二個工具,也就是"Facebook 針對 MySQL 開源 Online Schema Change 代碼"
參考文檔:
http://blog.chinaunix.net/uid-53720-id-3371360.html
http://blog.csdn.net/dbanote/article/details/18261377
參數中文說明:
http://www.cnblogs.com/zhoujinyi/p/3491059.html
正在測試環境測試,測試數據量大約是2500W左右,隨后有測試報告,沒什么問題就上生產環境了
pt-online-schema-change --alter "ADD category tinyint(4) NOT NULL DEFAULT '0'" D=庫名,t=表名 -uroot -p密碼 --dry-run
如果你的庫有主從結構,執行上面的語句遇到如下問題:
Cannot connect to D=calsync,h=從庫的IP,p=...,u=root
No slaves found. See --recursion-method if host localhost.localdomain has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
請在從庫上建一個root帳號且密碼和上面的密碼一樣,且主庫機可以訪問
如果出現如下內容:
Found 1 slaves:
localhost.localdomain
Will check slave lag on:
localhost.localdomain
恭喜主從的沒有問題了
測試數據如下:
數據量:3.1KW行記錄
執行時間:
情況比較曲折,多次出現鎖死退出的情況,最后停機且去掉一個索引,用時4個小時完成
mysql 5.1之前版本改表字段名,和建索引都要建臨時表,會很慢
mysql 5.1修改表字段名會重建臨時表來做事情,建索引不會建臨時表
mysql 5.6修改表字段名也不會臨時表