以下是一些加速 MyISAM
資料表查詢的常見提示
為了協助 MySQL 更好地最佳化查詢,請在使用資料載入資料表後,使用
ANALYZE TABLE
或在資料表上執行 myisamchk --analyze。這會更新每個索引部分的值,指出具有相同值的平均列數。(對於唯一索引,此值永遠為 1。)MySQL 使用此值來決定在您根據非常數運算式聯結兩個資料表時要選擇哪個索引。您可以使用SHOW INDEX FROM
並檢查tbl_name
Cardinality
值來檢查資料表分析的結果。myisamchk --description --verbose 會顯示索引分佈資訊。若要根據索引排序索引和資料,請使用 myisamchk --sort-index --sort-records=1(假設您想要根據索引 1 排序)。如果您有想要根據索引順序讀取所有列的唯一索引,這是加快查詢速度的好方法。第一次以這種方式排序大型資料表可能需要很長時間。
請盡量避免在經常更新的
MyISAM
資料表上使用複雜的SELECT
查詢,以避免讀取器和寫入器之間的競爭所導致的資料表鎖定問題。MyISAM
支援並行插入:如果資料表在資料檔案的中間沒有空閒區塊,則可以在其他執行緒從資料表讀取的同時將新列INSERT
到資料表中。如果能夠執行此操作很重要,請考慮使用避免刪除列的方式使用資料表。另一種可能性是在您從中刪除了大量列後,執行OPTIMIZE TABLE
來整理資料表。此行為可透過設定concurrent_insert
變數來變更。您可以強制將新列附加(因此允許並行插入),即使在已刪除列的資料表中也是如此。請參閱 第 10.11.3 節,「並行插入」。對於經常變更的
MyISAM
資料表,請盡量避免所有可變長度欄(VARCHAR
、BLOB
和TEXT
)。如果資料表包含即使是單一可變長度欄,則會使用動態列格式。請參閱 第 18 章,「替代儲存引擎」。通常,僅僅因為列變得很大而將資料表分割成不同的資料表是沒有用的。在存取列時,最大的效能影響是尋找列的第一個位元組所需的磁碟搜尋。找到資料後,大多數現代磁碟都能以足夠快的速度讀取整個列以供大多數應用程式使用。分割資料表產生明顯差異的唯一情況是,如果它是使用動態列格式的
MyISAM
資料表,而您可以將其變更為固定列大小,或者如果您經常需要掃描資料表,但不需要大多數欄。請參閱 第 18 章,「替代儲存引擎」。如果您通常以
的順序檢索資料列,請使用expr1
,expr2
, ...ALTER TABLE ... ORDER BY
。在對表格進行大量變更後使用此選項,您可能會獲得更高的效能。expr1
,expr2
, ...如果您經常需要根據大量資料列的資訊計算計數等結果,最好引入一個新表格並即時更新計數器。以下形式的更新速度非常快
UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
當您使用像
MyISAM
這種僅具有表格級鎖定的 MySQL 儲存引擎(多個讀取者與單一寫入者)時,這一點非常重要。這也能在使用大多數資料庫系統時提供更好的效能,因為在這種情況下,資料列鎖定管理員需要處理的事情較少。定期使用
OPTIMIZE TABLE
以避免動態格式的MyISAM
表格產生碎片。請參閱第 18.2.3 節「MyISAM 表格儲存格式」。使用
DELAY_KEY_WRITE=1
表格選項宣告MyISAM
表格可以加快索引更新速度,因為它們在表格關閉之前不會刷新到磁碟。缺點是如果此表格開啟時伺服器當機,您必須透過在伺服器啟動時設定myisam_recover_options
系統變數,或在重新啟動伺服器之前執行 myisamchk 來確保表格正常。(但是,即使在這種情況下,使用DELAY_KEY_WRITE
也不會有任何損失,因為索引鍵資訊始終可以從資料列產生。)在
MyISAM
索引中,字串會自動進行前綴和尾部空白壓縮。請參閱第 15.1.15 節「CREATE INDEX 語法」。您可以透過在應用程式中快取查詢或結果,然後一起執行多個插入或更新操作來提高效能。在此操作期間鎖定表格可確保在所有更新完成後,索引快取只會刷新一次。