mysql维护索引_高性能的MySQL(5)索引策略-索引和表的维护
維護(hù)表有三個(gè)主要的目的:
1、找到并修復(fù)損壞的表。
對(duì)于MyISAM存儲(chǔ)引擎來說,表損壞通常是系統(tǒng)崩潰導(dǎo)致的。其他的引擎也會(huì)由于硬件的問題,MySQL本身的缺陷或者操作系統(tǒng)的問題導(dǎo)致索引的損壞。
損壞的索引,會(huì)導(dǎo)致查詢返回錯(cuò)誤的結(jié)果或者莫須有的主鍵沖突等問題,嚴(yán)重時(shí)還會(huì)導(dǎo)致數(shù)據(jù)庫崩潰。
這類情況,可以嘗試check table來檢查是否發(fā)生了表損壞,有些存儲(chǔ)引擎不支持這個(gè)命令。
可以使用repair table 來修復(fù)損壞的表,但同樣不是所有引擎都支持該命令。
如果引擎不支持,可以使用alter操作重建表,或者將數(shù)據(jù)導(dǎo)出然后再重新導(dǎo)入。
InnoDB一般不會(huì)損壞,如果發(fā)生損壞,一般要么是數(shù)據(jù)庫硬件問題,例如內(nèi)存或者磁盤問題,要么就是數(shù)據(jù)庫管理員操作導(dǎo)致。
常見的錯(cuò)誤是由于嘗試使用rsync備份InnoDB導(dǎo)致的。
如果是某條查詢導(dǎo)致的,那一定是遇到了bug,而不是查詢的問題。
2、維護(hù)準(zhǔn)確的索引統(tǒng)計(jì)信息。
MySQL的查詢優(yōu)化器會(huì)通過2個(gè)API來了解存儲(chǔ)引擎的索引值的分布信息,以決定如何使用索引。
第一個(gè)API是records_in_range(),通過向存儲(chǔ)引擎?zhèn)魅雰蓚€(gè)邊界值獲取在這個(gè)范圍大概有多少條記錄。
對(duì)于某些引擎,該接口返回精確值,比方說MyISAM;對(duì)于InnoDB則是一個(gè)估算的值。
第二個(gè)API是info(),該接口返回各種類型的數(shù)據(jù),包括索引的基數(shù)。
當(dāng)返回信息不準(zhǔn)確的時(shí)候,優(yōu)化器會(huì)使用索引統(tǒng)計(jì)信息來估算掃描行數(shù)。如果表沒有統(tǒng)計(jì)信息,或者統(tǒng)計(jì)信息不準(zhǔn)確,優(yōu)化器很可能做出錯(cuò)誤的決定。
可以運(yùn)行analyze table 來重新生成統(tǒng)計(jì)信息。
Memory引擎不存儲(chǔ)索引統(tǒng)計(jì)信息
MyISAM將索引統(tǒng)計(jì)信息存儲(chǔ)在磁盤中,analyze table 需要進(jìn)行一次全表掃描,整個(gè)過程需要鎖表。
MySQL5.5以后,InnoDB也不在磁盤存儲(chǔ)索引統(tǒng)計(jì)信息,而是通過隨機(jī)的索引訪問來進(jìn)行評(píng)估并存儲(chǔ)在內(nèi)存中。
使用show index from 命令可以察看索引基數(shù)(Cardinality)
InnoDB會(huì)在首次打開表,或者執(zhí)行analyze table,或者表大小發(fā)生變化超過1/16或show table status,或show index時(shí)候都會(huì)計(jì)算索引的統(tǒng)計(jì)信息,如果服務(wù)器有大量的數(shù)據(jù),這會(huì)是個(gè)嚴(yán)重的問題,只要show index查看索引統(tǒng)計(jì)信息就一定會(huì)觸發(fā)統(tǒng)計(jì)信息更新,可以關(guān)閉
innodb_stats_on_metadata參數(shù)來關(guān)閉。
一旦關(guān)閉自動(dòng)更新,那么需要周期性的使用analyze table 來手動(dòng)更新,否則問題大了。
3、減少索引和數(shù)據(jù)碎片
B-Tree索引可能會(huì)碎片化,這會(huì)降低查詢效率。碎片化的索引可能會(huì)以很差或者無序的方式存儲(chǔ)在磁盤上。
可以通過optimize table 或者導(dǎo)出再導(dǎo)入的方式來重新整理數(shù)據(jù)。
對(duì)于不支持optimize table 的存儲(chǔ)引擎,可以通過一個(gè)不做任何操作的alter table來重建表。alter table
也可以先刪除索引,重建表,最后重新創(chuàng)建索引來實(shí)現(xiàn)。
索引的介紹就先到這里了,明天進(jìn)入查詢性能優(yōu)化部分!
總結(jié)
以上是生活随笔為你收集整理的mysql维护索引_高性能的MySQL(5)索引策略-索引和表的维护的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目启动时socket自动启动_spri
- 下一篇: mysql基于binlog增量更新_一个