最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 索引和數(shù)據(jù)表該如何維護(hù)

 更新時(shí)間:2021年05月13日 10:52:41   作者:島上碼農(nóng)  
使用合適的數(shù)據(jù)類(lèi)型完成數(shù)據(jù)表創(chuàng)建和建立索引后,工作并沒(méi)有完結(jié)——你需要去維護(hù)數(shù)據(jù)表和索引以保證它們運(yùn)行良好。數(shù)據(jù)表維護(hù)的主要目的是查找和修復(fù)沖突,維護(hù)精確的索引統(tǒng)計(jì)和減少碎片。

查找和修復(fù)數(shù)據(jù)表沖突

數(shù)據(jù)表最糟糕的事情就是發(fā)生沖突。使用MyISAM存儲(chǔ)引擎時(shí),通常因?yàn)楸罎?dǎo)致沖突。然而,當(dāng)存在硬件故障、MySQL內(nèi)部Bug或操作系統(tǒng)Bug時(shí),所有的存儲(chǔ)引擎都可能遭受索引沖突。

沖突的索引可能導(dǎo)致查詢(xún)返回錯(cuò)誤的結(jié)果,在沒(méi)有重復(fù)值時(shí)的重復(fù)索引錯(cuò)誤增加,甚至可能導(dǎo)致全表掃描或崩潰。如果你遇到過(guò)偶發(fā)的事件,例如一個(gè)你認(rèn)為不會(huì)發(fā)生的錯(cuò)誤,這個(gè)時(shí)候運(yùn)行CHECK TABLE命令去檢測(cè)數(shù)據(jù)表是否有沖突(注意有些數(shù)據(jù)庫(kù)引擎不支持這個(gè)命令,有些則支持多種選項(xiàng)參數(shù)去指定如何檢測(cè)表)。通常,CHECK TABLE命令會(huì)捕獲大部分的數(shù)據(jù)表和索引錯(cuò)誤。

你可以通過(guò)REPAIR TABLE命令修復(fù)數(shù)據(jù)表錯(cuò)誤,但是也不是全部存儲(chǔ)引擎都支持這個(gè)命令。這個(gè)時(shí)候你需要執(zhí)行一個(gè)“沒(méi)有操作”的ALTER語(yǔ)句,例如將一個(gè)數(shù)據(jù)表的引擎修改為和當(dāng)前的引擎一樣,例如可以對(duì)InnoDB的數(shù)據(jù)表執(zhí)行下面的語(yǔ)句:

ALTER TABLE innodb_tb1 ENGINE=INNODB;

相應(yīng)地,你也可以使用一個(gè)存儲(chǔ)引擎指定的離線(xiàn)修復(fù)工具,例如myisamchk,或者導(dǎo)出數(shù)據(jù)再重新導(dǎo)入。然而,如果沖突發(fā)生在系統(tǒng)區(qū),或者在數(shù)據(jù)表的數(shù)據(jù)行區(qū)域,而不是索引的話(huà),你可能無(wú)法使用這些辦法。這種情況下,你可能需要從你的備份中恢復(fù)數(shù)據(jù)或從沖突的文件中恢復(fù)數(shù)據(jù)。

如果你在InnoDB中也遇到了沖突,這會(huì)是極其嚴(yán)重的錯(cuò)誤,你需要使用正確的方法去分析問(wèn)題。InnoDB通常不會(huì)發(fā)生沖突。它的設(shè)計(jì)對(duì)沖突處理很健壯。沖突會(huì)是硬件故障(如內(nèi)存區(qū)錯(cuò)誤或磁盤(pán)錯(cuò)誤),DBA的操作錯(cuò)誤(如在MySQL環(huán)境外操作了數(shù)據(jù)庫(kù)文件)或InnoDB自身的Bug (這種概率很低)的表現(xiàn)。通常的一個(gè)原因類(lèi)似視圖使用rsync工具創(chuàng)建備份的錯(cuò)誤。這時(shí)沒(méi)有可執(zhí)行的查詢(xún)——由于這會(huì)引起InnoDB的數(shù)據(jù)沖突,而你認(rèn)為這會(huì)避免。如果你通過(guò)一個(gè)有問(wèn)題的查詢(xún)引起了InnoDB的數(shù)據(jù)沖突,那這并不是你的錯(cuò)誤,這是InnoDB的Bug。

如果真的遇到了數(shù)據(jù)沖突,最重要的事情是搞清楚引起沖突的原因,在這之前不要簡(jiǎn)單地修復(fù)數(shù)據(jù),也許這個(gè)沖突會(huì)自動(dòng)消失。你可以通過(guò)innodb_force_recovery參數(shù)將InnoDB修改為強(qiáng)制恢復(fù)模式來(lái)修復(fù)數(shù)據(jù)(可以查閱MySQL的操作手冊(cè))。你也可以使用開(kāi)源的Percona InnoDB數(shù)據(jù)恢復(fù)工具(www.percona.com/software/my…)從損壞的數(shù)據(jù)文件中提取數(shù)據(jù)。

更新索引統(tǒng)計(jì)

MySQL查詢(xún)優(yōu)化器在決定如何使用索引前,會(huì)調(diào)用兩個(gè)API獲取索引值的分布。第一個(gè)是records_in_range方法,該方法接收一個(gè)范圍參數(shù),然后返回該范圍的結(jié)果數(shù)量。對(duì)于MyISAM引擎來(lái)說(shuō)返回結(jié)果是準(zhǔn)確的,但是對(duì)于InnoDB來(lái)說(shuō)是估計(jì)值。

第二個(gè)API是info方法,該方法返回多種類(lèi)型的數(shù)據(jù),包括索引候選者(即每個(gè)索引對(duì)應(yīng)的記錄數(shù)量估計(jì)值)。

當(dāng)存儲(chǔ)引擎給查詢(xún)優(yōu)化器提供不太準(zhǔn)確的數(shù)據(jù)行數(shù)信息,或查詢(xún)計(jì)劃過(guò)于復(fù)雜而無(wú)法估計(jì)準(zhǔn)確的行數(shù)時(shí),優(yōu)化器使用索引統(tǒng)計(jì)去估計(jì)數(shù)據(jù)行數(shù)。MySQL優(yōu)化器是基于查詢(xún)代價(jià)做出決策的,最主要的代價(jià)準(zhǔn)則就是這次查詢(xún)會(huì)查找的數(shù)據(jù)量。如果索引統(tǒng)計(jì)從來(lái)沒(méi)有生成,或者是過(guò)期了,優(yōu)化器可能會(huì)做出錯(cuò)誤的決定。解決的方案是運(yùn)行ANALYZE TABLE命令,該命令會(huì)重建索引統(tǒng)計(jì)。

每個(gè)存儲(chǔ)引擎實(shí)現(xiàn)索引統(tǒng)計(jì)的方式不同,因此你運(yùn)行ANALUZE TABLE命令的頻率也會(huì)不同,運(yùn)行該命令的代價(jià)也不同,典型的存儲(chǔ)引擎對(duì)索引統(tǒng)計(jì)處理方式如下:

  • Memory引擎不存儲(chǔ)索引統(tǒng)計(jì)。
  • MyISAM在磁盤(pán)存儲(chǔ)索引統(tǒng)計(jì),并且ANALYZE TABLE在計(jì)算候選數(shù)據(jù)行的時(shí)候使用全索引掃描。整個(gè)表在這個(gè)過(guò)程中會(huì)被鎖定。
  • InnoDB在MySQL 5.5版本中不在磁盤(pán)存儲(chǔ)索引統(tǒng)計(jì),而是通過(guò)隨機(jī)的索引采樣實(shí)現(xiàn)并且將結(jié)果存在內(nèi)存中。

可以通過(guò)SHOW INDEX FROM命令檢查索引的候選者。例如:

這個(gè)命令給了很多索引相關(guān)的信息,可以查閱MySQL的手冊(cè)了解具體細(xì)節(jié)。這里需要特別關(guān)注的是Cardinality列。該列展示了存儲(chǔ)引擎估計(jì)的索引對(duì)應(yīng)了多少個(gè)不同的值。在MySQL 5.0及更新的版本中,也可以通過(guò)INFORMATION_SCHEMA.STATISTICS表中獲取這些信息,這十分方便。例如,你可以根據(jù)INFORMATION_SCHEMA查詢(xún)?nèi)フ业侥切┑秃Y選性的索引。但是注意,對(duì)于數(shù)據(jù)量龐大的服務(wù)器,這些中間表可能會(huì)導(dǎo)致服務(wù)器的負(fù)荷大量增加。

InnoDB的統(tǒng)計(jì)值得深入研究。統(tǒng)計(jì)的結(jié)果是通過(guò)索引數(shù)據(jù)頁(yè)的隨機(jī)采樣計(jì)算得到的,這是假設(shè)剩余未被采樣到的數(shù)據(jù)也是類(lèi)似的分布。在舊的InnoDB版本中,這個(gè)采樣的頁(yè)數(shù)是8,但最新版本的可以通過(guò)innodb_stats_sample_pages變量調(diào)整。將這個(gè)值設(shè)置為大于8有助于生成更具代表性的索引統(tǒng)計(jì),尤其是對(duì)于大的數(shù)據(jù)表,但所需要花的代價(jià)也會(huì)不同。

InnoDB在數(shù)據(jù)表第一次打開(kāi),運(yùn)行ANALUZE TABLE和數(shù)據(jù)表存儲(chǔ)大小顯著改變時(shí)(1/16的變化量或20億行的插入)會(huì)計(jì)算索引統(tǒng)計(jì)。

INFORMATION_SCHEMA表的某些查詢(xún),運(yùn)行SHOW TABLE STATUS,執(zhí)行SHOW INDEX查詢(xún)或MySQL命令行客戶(hù)端啟用了自動(dòng)完成設(shè)置,InnoDB也會(huì)計(jì)算索引統(tǒng)計(jì)。這實(shí)際會(huì)對(duì)大數(shù)據(jù)量,或I/O速度很慢的服務(wù)器造成嚴(yán)重的問(wèn)題??蛻?hù)端程序或監(jiān)控工具導(dǎo)致發(fā)生重新采樣會(huì)導(dǎo)致很多鎖和加重服務(wù)器負(fù)擔(dān),也會(huì)影響終端用戶(hù)的啟動(dòng)時(shí)間。由于SHOW INDEX命令會(huì)更新索引統(tǒng)計(jì),而如果你不更改的話(huà)你無(wú)法觀測(cè)到索引統(tǒng)計(jì)。你可以通過(guò)禁用innodb_stats_on_metadata(默認(rèn)是關(guān)閉的)選項(xiàng)去避免這些問(wèn)題。下面的命令可以查出InnoDB索引統(tǒng)計(jì)相關(guān)的系統(tǒng)變量。

SHOW GLOBAL VARIABLES WHERE Variable_name like 'innodb_stats%'

如果使用的是包含了替換InnoDB的Percona XtraDB存儲(chǔ)引擎的Percona服務(wù)器,你可以做進(jìn)一步的配置。innodb_stats_auto_update選項(xiàng)可以讓你禁止自動(dòng)采樣,可以有效凍結(jié)自動(dòng)統(tǒng)計(jì)計(jì)算,除非你手動(dòng)運(yùn)行ANALYZE TABLE。這可以讓你擺脫不穩(wěn)定的查詢(xún)。這個(gè)特性是基于那些大型部署系統(tǒng)客戶(hù)的要求添加的。

為追求更高的查詢(xún)計(jì)劃穩(wěn)定性和更快的系統(tǒng)啟動(dòng)速度,你可以使用系統(tǒng)級(jí)的數(shù)據(jù)表存儲(chǔ)索引統(tǒng)計(jì)。這種方式在系統(tǒng)重啟或InnoDB第一次啟動(dòng)打開(kāi)數(shù)據(jù)表時(shí)不需要重新計(jì)算索引統(tǒng)計(jì)。這個(gè)特性在Percona 5.1版本已經(jīng)得到支持,并且在標(biāo)準(zhǔn)的MySQL 5.6版本已經(jīng)得到支持。Percona服務(wù)器這個(gè)特性是通過(guò)innodb_use_sys_stats_table選項(xiàng)啟用的。在MySQL 5.6版本后,是通過(guò)innodb_stats_persistent選項(xiàng)控制的,默認(rèn)是ON。同時(shí),還有一個(gè)變量控制單表的,innodb_stats_auto_recalc變量默認(rèn)為ON,會(huì)在數(shù)據(jù)表變化量超過(guò)10%時(shí)重新統(tǒng)計(jì)該表的索引統(tǒng)計(jì)(手冊(cè)可以參考:dev.mysql.com/doc/refman/…)。

如果你沒(méi)有配置自動(dòng)更新索引統(tǒng)計(jì),你需要定期使用ANALYZE TABLE命令來(lái)更新索引統(tǒng)計(jì),除非你知道不更新不會(huì)導(dǎo)致糟糕的查詢(xún)計(jì)劃。

以上就是MySQL 索引和數(shù)據(jù)表該如何維護(hù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 索引和數(shù)據(jù)表維護(hù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql?自增長(zhǎng)約束(auto_increment)的使用

    mysql?自增長(zhǎng)約束(auto_increment)的使用

    MySQL中的自增長(zhǎng)約束(auto_increment)用于自動(dòng)為表的主鍵字段生成唯一的遞增值,通過(guò)設(shè)置該屬性,可以簡(jiǎn)化主鍵的管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • MySQL分區(qū)之指定各分區(qū)路徑詳解

    MySQL分區(qū)之指定各分區(qū)路徑詳解

    mysql分區(qū)后每個(gè)分區(qū)成了獨(dú)立的文件,雖然從邏輯上還是一張表其實(shí)已經(jīng)分成了多張獨(dú)立的表,下面這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)之指定各分區(qū)路徑的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • mysql5.7 設(shè)置遠(yuǎn)程訪(fǎng)問(wèn)的實(shí)現(xiàn)

    mysql5.7 設(shè)置遠(yuǎn)程訪(fǎng)問(wèn)的實(shí)現(xiàn)

    這篇文章主要介紹了mysql5.7 設(shè)置遠(yuǎn)程訪(fǎng)問(wèn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • MYSQL速度慢的問(wèn)題 記錄數(shù)據(jù)庫(kù)語(yǔ)句

    MYSQL速度慢的問(wèn)題 記錄數(shù)據(jù)庫(kù)語(yǔ)句

    Web程序慢,首先的一個(gè)檢測(cè)對(duì)象就是數(shù)據(jù)庫(kù),寫(xiě)過(guò)幾年程序的都知道。現(xiàn)在想追蹤MySQL中那些拖累服務(wù)器性能的SQL語(yǔ)句,怎么辦
    2012-06-06
  • rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲(chǔ)位置的實(shí)現(xiàn)

    rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲(chǔ)位置的實(shí)現(xiàn)

    在Linux環(huán)境下進(jìn)行MySQL的安裝可以使用不同的方式,但在本文中我們將關(guān)注一種特定的方式,即通過(guò)RPM包的方式進(jìn)行安裝,本文主要介紹了rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲(chǔ)位置的實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • 詳解MySQL中Order By排序和filesort排序的原理及實(shí)現(xiàn)

    詳解MySQL中Order By排序和filesort排序的原理及實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了MySQL的Order By排序的底層原理與filesort排序,以及排序優(yōu)化手段,文中的示例代碼講解詳細(xì),感興趣的小編可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • 如何正確、安全地關(guān)閉MySQL

    如何正確、安全地關(guān)閉MySQL

    當(dāng)需要停止或關(guān)閉MySQL實(shí)例時(shí),很多人并不清楚如何做到正確、安全地關(guān)閉MySQL,會(huì)對(duì)數(shù)據(jù)的安全性和穩(wěn)定性造成很大的威脅,本文將從多個(gè)方面詳細(xì)闡述如何正確關(guān)閉MySQL,包括關(guān)閉MySQL的基本方法、關(guān)閉MySQL前的準(zhǔn)備工作、優(yōu)雅地關(guān)閉MySQL以及遇到MySQL無(wú)法正常關(guān)閉的情況
    2023-09-09
  • mysql查詢(xún)連續(xù)記錄方式

    mysql查詢(xún)連續(xù)記錄方式

    這篇文章主要介紹了mysql查詢(xún)連續(xù)記錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • MySQL中INSERT+SELECT的使用方式

    MySQL中INSERT+SELECT的使用方式

    MySQL的INSERT INTO SELECT FROM語(yǔ)句允許用戶(hù)通過(guò)一條SQL語(yǔ)句實(shí)現(xiàn)從一個(gè)或多個(gè)表中查詢(xún)數(shù)據(jù)并將結(jié)果插入到另一個(gè)表中,這種方式特別適用于需要將數(shù)據(jù)從一張表遷移到另一張表,或者基于多表查詢(xún)結(jié)果創(chuàng)建新表的場(chǎng)景
    2024-10-10
  • MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試

    MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試

    MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試...
    2006-12-12

最新評(píng)論

出国| 南华县| 建昌县| 海兴县| 资阳市| 克拉玛依市| 天长市| 寻甸| 逊克县| 双流县| 永和县| 山西省| 夏河县| 阿勒泰市| 毕节市| 商河县| 紫阳县| 西城区| 湖北省| 定襄县| 宣汉县| 朝阳县| 政和县| 乐至县| 高雄县| 阿拉善左旗| 安顺市| 宁武县| 建湖县| 安阳市| 边坝县| 定日县| 清涧县| 贺州市| 资兴市| 兴文县| 垣曲县| 北碚区| 宝丰县| 舟山市| 乌海市|