mysql8支持myISAM_mysql8 参考手册--优化MyISAM表
MyISAM存儲引擎在以讀為主的數據或低并發操作中表現最好,因為表鎖限制了同時執行更新的能力。在MySQL中,InnoDB是默認的存儲引擎,而不是MyISAM。
優化MyISAM查詢
一些加快MyISAM表查詢的一般技巧 :
為了幫助MySQL更好地優化查詢,可以使用ANALYZE TABLE或運行--analyze 在加載了數據的表上進行分析。這將更新每個索引部分的值,該值指示具有相同值的平均行數。(對于唯一索引,始終為1。)MySQL使用此選項來決定在基于非常量表達式連接兩個表時選擇哪個索引。通過使用SHOW INDEX from tbl_name并檢查基數值,可以檢查表分析的結果。myisamchk--description--verbose顯示索引分布信息。
要根據索引對索引和數據進行排序,請使用 myisamchk --sort-index --sort-records = 1 (假設您要對索引1進行排序)。如果您有一個唯一的索引,要根據該索引按順序讀取所有行,這是使查詢更快的一種好方法。第一次以這種方式對大表進行排序可能會花費很長時間。
嘗試避免SELECT 對MyISAM頻繁更新的表進行復雜的查詢,以避免由于讀取器和寫入器之間的爭用而發生的表鎖定問題。
MyISAM支持并發插入:如果表在數據文件的中間沒有空閑塊,則可以INSERT在其他線程從表讀取數據的同時向其中添加新行。如果能夠做到這一點很重要,請考慮以避免刪除行的方式使用表。另一種可能性是運行OPTIMIZE TABLE到整理表你已經刪除了很多這行之后。通過設置concurrent_insert變量可以更改此行為 。您甚至可以在已刪除行的表中強制添加新行(并因此允許并發插入)。請參見第8.11.3節“并發插入”。
對于MyISAM表經常變化的,盡量避免所有變長列(VARCHAR, BLOB,和 TEXT)。如果該表甚至只包含一個可變長度的列,則使用動態行格式。請參見第16章,備用存儲引擎。
通常,僅由于行變大而將表拆分為不同的表是沒有用的。在訪問一行時,最大的性能損失是查找該行第一個字節所需的磁盤搜索。找到數據后,大多數現代磁盤可以以足夠快的速度讀取整個行,以適合大多數應用程序。拆分表的唯一情況是MyISAM,可以更改為固定行大小的表是使用動態行格式的 表,還是經常需要掃描表但不需要大多數列的表。請參見第16章,備用存儲引擎。
通常用于按順序檢索expr1, expr2, ...行時 使用ALTER TABLE ... ORDER BYexpr1, expr2, ...。通過在對該表進行大量更改之后使用此選項,您可能可以獲得更高的性能。
如果您經常需要基于大量行中的信息來計算結果(例如計數),則最好引入一個新表并實時更新計數器。以下表格的更新非常快:
UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
當您使用MySQL存儲引擎(例如MyISAM僅具有表級鎖定(具有單個編寫器的多個讀取器))時,這非常重要。這也使大多數數據庫系統具有更好的性能,因為在這種情況下,行鎖定管理器的工作量減少了。
OPTIMIZE TABLE 定期 使用以避免動態格式MyISAM表的碎片化 。請參見 第16.2.3節“ MyISAM表存儲格式”。
MyISAM使用 DELAY_KEY_WRITE=1table選項 聲明表可以使索引更新更快,因為在關閉表之前,它們不會刷新到磁盤。不利的一面是,如果在打開此類表時某些東西殺死了服務器,則必須通過myisam_recover_options 設置系統變量集運行服務器,或者在重新啟動服務器之前運行 myisamchk來確保該表正常 。(但是,即使在這種情況下,也不要通過使用來丟失任何內容DELAY_KEY_WRITE,因為密鑰信息始終可以從數據行中生成。)
字符串會在MyISAM索引中自動壓縮前綴和結尾空間。請參見 第13.1.15節“ CREATE INDEX語句”。
您可以通過在應用程序中緩存查詢或答案,然后一起執行許多插入或更新操作來提高性能。在此操作期間鎖定表可確保索引緩存在所有更新之后僅刷新一次。
總結
以上是生活随笔為你收集整理的mysql8支持myISAM_mysql8 参考手册--优化MyISAM表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python蒙特卡洛模拟_基于Pytho
- 下一篇: 并发执行变成串行_大神浅谈数据库并发控制