mysql analyze和optimize

Analyze Table

MySQL 的Optimizer(優化元件)在優化SQL語句時,首先須要收集一些相關信息,其中就包括表的cardinality(能夠翻譯爲「散列程度」),它表示某個索引對應的列包含多少個不一樣的值——若是cardinality大大少於數據的實際散列程度,那麼索引就基本失效了。優化

咱們可使用SHOW INDEX語句來查看索引的散列程度:

SHOW INDEX FROM PLAYERS;

TABLE   KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
PLAYERS PRIMARY PLAYERNO             14

由於此時PLAYER表中不一樣的PLAYERNO數量遠遠多於14,索引基本失效。
下面咱們經過Analyze Table語句來修復索引:

ANALYZE TABLE PLAYERS;
SHOW INDEX FROM PLAYERS;
結果是:
TABLE   KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
PLAYERS PRIMARY PLAYERNO           1000

此時索引已經修復,查詢效率大大提升。

須要注意的是,若是開啓了binlog,那麼Analyze Table的結果也會寫入binlog,咱們能夠在analyze和table之間添加關鍵字local取消寫入 
spa

 

Optimize Table

若是您已經刪除了表的一大部分,或者若是您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了不少更改,則應使用 OPTIMIZE TABLE。被刪除的記錄被保持在連接清單中,後續的INSERT操做會從新使用舊的記錄位置。您可使用OPTIMIZE TABLE來從新 利用未使用的空間,並整理數據文件的碎片。翻譯

在多數的設置中,您根本不須要運行OPTIMIZE TABLE。即便您對可變長度的行進行了大量的更新,您也不須要常常運行,每週一次或每個月一次 便可,只對特定的表運行。索引

OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起做用。it

注意,在OPTIMIZE TABLE運行過程當中,MySQL會鎖定表。table

與Analyze Table同樣,Optimize Table也可使用local來取消寫入binlog。class

相關文章
相關標籤/搜索