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