插入大資料時,有索引會很慢,可以DISABLE KEYS,或者直接在table中加入DELAY_KEY_WRITE
註:
delay_key_write這個參數只對myisam類型表有效
如果你某個表需要經常update操作,這個參數就很管用!
但等delay_key_write使用時,出現斷電或重啟時,會導致在cache的索引update沒來得及更新,所以必須在啟動參數加上 –myisam-recover,或者在conf設定myisam-recover=BACKUP,FORCE。這樣在你啟動mysql的時候會檢查你的 表並同步表和索引.
另外如果修複myisam類表可以在my.cnf中mysqld段設定myisam-recover恢複功能,參數有:default,force,backup,QUICK
1.
LOCK TABLES `test` WRITE;
ALTER TABLE `test` DISABLE KEYS ;
INSERT INTO `test` VALUES (1,'???',80,1),(2,'???',90,2),(1,'李四',80,3),(2,'王五',90,4),(1,'aa',12,5), (3,'aa',123,6),(4,'aadwa',123,7);
ALTER TABLE `test` ENABLE KEYS;
UNLOCK TABLES;
2.
最近天天MySQL負載經常一會高,一會低的不穩定。整天還被perl 折騰著,暈死了。 首先, iostat -x 1看看是不是 io 瓶頸較大。iowait 才 0.45 見鬼,多又是程式問題。top 一下看看了 mysqld 消耗CPU非常厲害估計又是程式問題。用我的per程式取了下 MySQL的資料發現 key_writes / key_write_request 幾乎接近 1了。暈說明,update,delete, insert 語句非常平凡。最後看了 binlog 僅1小時 有個表 有1w多次 UPDATE操作, 看來需要 開啟 delay_key_write 了。這個參數只對 MyISAM有效,可以再create table 時指定 delay_key_write ,如果表已經存在可以使用 alter table sometable delay_key_write =1; 如果你的某個表有很多update操作,這個參數的優勢會很好的體現出來。因為這個參數能延遲更新索引到表關閉。當我們需要經常跟新一個大表的時候,可以考慮使用這個參數。 那麼,表關閉會在什麼時候發生?你可以理解成當flash table的時候,表將關閉。那麼有2種情況將會發生 flush table:
當cache 滿了一個新的thread試圖開啟一個表的時候,那個表沒有在cache;
當cache裡的表數比table_cache多時thread不在使用表;
這個2種情況將會flush table。 當delay_key_write 使用的時候,如果出現重啟或者掉電等情況,會導致在cache的索引update沒來得及更新,所以必須在啟動參數加上--myisam-recover,或者在conf設定myisam-recover=BACKUP,FORCE。這樣在你啟動mysql的時候會檢查你的表並同步表和索引.
常用MySQL的童鞋都知道這個myisam類型的表極容易損壞,多數人可能都是用myisamchk命令來人工修複,下面介紹一種自動修複myisam的方法,也是我上午剛學的,共同進步,呵呵~
在MySQL的設定檔my.cnf中,啟動項部分加入myisam-recover設定資料恢複功能,具體參數如下:
DEFAULT
與沒有使用--myisam-recover選項相同。
BACKUP
如果在恢複過程中,資料檔案被更改了,將tbl_name.MYD檔案備份為tbl_name-datetime.BAK。
FORCE
即使.MYD檔案將丟掉多個行也進行恢複。
QUICK
如果沒有刪除塊,不要檢查表中的行。
我設定了BACKUP和FORCE參數,如下:
[mysqld]
myisam-recover=BACKUP,FORCE
此參數詳細情況,請參考MySQL手冊http://dev.mysql.com/doc/refman/5.0/en/server-options.html