国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

讀高性能MySQL(第4版)筆記09_創(chuàng)建高性能索引(下)

這篇具有很好參考價值的文章主要介紹了讀高性能MySQL(第4版)筆記09_創(chuàng)建高性能索引(下)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

讀高性能MySQL(第4版)筆記09_創(chuàng)建高性能索引(下)文章來源地址http://www.zghlxwxcb.cn/news/detail-709771.html

1.?覆蓋索引

1.1.?設計優(yōu)秀的索引應該考慮到整個查詢,而不單是WHERE條件部分

1.2.?如果一個索引包含(或者說覆蓋)所有需要查詢的字段的值,我們就稱之為覆蓋索引

1.3.?只有B-tree索引可以用于覆蓋索引

1.4.?如果查詢只需要掃描索引而無須回表

1.4.1.?索引條目通常遠小于數(shù)據行大小,所以如果只需要讀取索引,那么MySQL就會極大地減少數(shù)據訪問量

1.4.2.?覆蓋索引對于I/O密集型的應用也有幫助,因為索引比數(shù)據更小,更容易全部放入內存中

1.4.3.?因為索引是按照列值的順序存儲的(至少在單頁內如此),所以對于I/O密集型的范圍查詢會比隨機從磁盤讀取每一行數(shù)據的I/O要少得多

1.4.4.?由于InnoDB的聚簇索引的特點,覆蓋索引對InnoDB表特別有用

1.4.4.1.?InnoDB的二級索引在葉子節(jié)點中保存了記錄的主鍵值,所以如果二級索引能夠覆蓋查詢,則可以避免對主鍵索引的二次查詢

1.5.?在索引中滿足查詢的成本一般比查詢記錄本身要小得多

2.?使用索引掃描來做排序

2.1.?生成有序的結果

2.1.1.?通過排序操作

2.1.2.?按索引順序掃描

2.2.?如果索引不能覆蓋查詢所需的全部列,那么就不得不每掃描一條索引記錄都回表查詢一次對應的記錄

2.2.1.?基本上都是隨機I/O

2.2.2.?按索引順序讀取數(shù)據的速度通常要比順序地全表掃描慢,尤其是在I/O密集型的應用負載上

2.3.?只有當索引的順序和ORDER BY子句的順序完全一致,并且所有列的排序方向(倒序或正序)都一樣時,MySQL才能使用索引來對結果做排序

2.4.?如果前導列為常量的時候,ORDER BY子句中的列也可以不滿足索引的最左前綴的要求

2.5.?如果在WHERE子句或者JOIN子句中將這些列指定為了常量,就可以“填補”索引字段的間隙了

2.6.?使用索引做排序的另一個最重要的場景是,查詢語句中同時有ORDERBY和LIMIT子句的情況

3.?重復索引

3.1.?指在相同的列上按照相同順序創(chuàng)建的相同類型的索引

3.2.?MySQL允許在相同列上創(chuàng)建多個相同的索引

3.2.1.?MySQL會拋出一個警告,但是并不會阻止你這么做

3.2.2.?MySQL需要單獨維護重復的索引,優(yōu)化器在優(yōu)化查詢的時候也需要逐個地進行評估,這會影響性能,同時也浪費磁盤空間

4.?冗余索引

4.1.?如果創(chuàng)建了索引(A,B),再創(chuàng)建索引(A)就是冗余索引

4.1.1.?索引(A,B)也可以當作索引(A)來使用

4.1.2.?前一個索引的前綴索引

4.1.3.?這種冗余只是對B-tree索引來說的

4.2.?如果再創(chuàng)建索引(B,A),則不是冗余索引,索引(B)也不是,因為B不是索引(A,B)的最左前綴列

4.3.?將一個索引擴展為(A,ID),其中ID是主鍵,因為主鍵列已經包含在二級索引中了,所以這也是冗余的

4.4.?冗余索引通常發(fā)生在為表添加新索引的時候

4.5.?大多數(shù)情況下都不需要冗余索引,應該盡量擴展已有的索引而不是創(chuàng)建新的索引

4.6.?出于性能方面的考慮也需要冗余索引,因為擴展已有的索引會導致其變得太大,從而影響其他使用該索引的查詢的性能

4.7.?索引越多,插入的速度越慢

4.7.1.?增加新索引會導致INSERT、UPDATE、DELETE等操作的速度變慢,特別是當新增索引后達到了內存瓶頸的時候

5.?未使用的索引

5.1.?一些服務器永遠不用的索引

5.2.?這樣的索引完全是累贅,建議刪除

5.3.?找到未使用索引的最好辦法就是使用系統(tǒng)數(shù)據庫performance_schema和sys

5.4.?在sys數(shù)據庫中,在table_io_waits_summary_by_index_usage視圖中可以非常簡單地知道哪些索引從來沒有被使用過

6.?解決冗余索引和重復索引的方法

6.1.?刪除這些索引就可以了

6.2.?針對INFORMATION_SCHEMA表編寫各種復雜的查詢來識別這類索引

6.3.?Percona工具箱中的pt-duplicate-key-checker,該工具通過分析表結構來找出冗余和重復索引

6.4.?使用Percona工具箱中的pt-upgrade工具來仔細檢查計劃中的索引變更

6.5.?使用MySQL 8.0的不可見索引特性,而不是直接刪除索引

6.5.1.?可以通過ALTER TABLE語句,改變索引的一個標志位,使得優(yōu)化器在確定執(zhí)行計劃時,忽略該索引

6.5.2.?如果你發(fā)現(xiàn)計劃刪除的索引依舊有非常重要的作用,可以直接把索引改成可見,而不需要重新構建該索引

7.?維護索引和表

7.1.?找到并修復損壞的表

7.1.1.?對于數(shù)據表來說,最糟糕的情況就是表被損壞了

7.1.2.?損壞的索引會導致查詢返回錯誤的結果或者出現(xiàn)莫須有的主鍵沖突等問題,嚴重時甚至還會導致數(shù)據庫的崩潰

7.1.3.?可以嘗試運行CHECK TABLE來檢查是否發(fā)生了表損壞

7.1.4.?可以使用REPAIR TABLE命令來修復損壞的表

7.1.5.?如果是InnoDB存儲引擎的表發(fā)生了損壞,那么一定是發(fā)生了嚴重的錯誤,需要立刻調查一下原因

7.1.5.1.?常見的類似錯誤通常是由于嘗試使用rsync備份InnoDB導致的

7.1.6.?如果遇到數(shù)據損壞,最重要的是找出是什么導致了損壞,而不只是簡單地修復,否則很有可能還會不斷地出現(xiàn)數(shù)據損壞的情況

7.2.?維護準確的索引統(tǒng)計信息

7.2.1.?MySQL的優(yōu)化器使用的是基于成本的模型,而衡量成本的主要指標就是一個查詢需要掃描多少行

7.2.2.?可以使用SHOW INDEX FROM命令來查看索引的基數(shù)(cardinality)

7.3.?減少索引和數(shù)據的碎片

7.3.1.?B-tree索引可能會產生碎片化,這會降低查詢的效率

7.3.2.?碎片化的索引可能會以很差或者無序的方式存儲在磁盤上

7.3.3.?如果葉子頁在物理分布上是順序且緊密的,那么查詢的性能就會更好

7.3.3.1.?否則,對于范圍查詢、索引覆蓋掃描等操作來說,速度可能會降低很多

7.3.3.2.?對于索引覆蓋掃描,這一點會表現(xiàn)得更加明顯

7.3.4.?行碎片(Row fragmentation)

7.3.4.1.?數(shù)據行被存儲在多個地方的多個片段中

7.3.4.2.?即使查詢只從索引中訪問一行記錄,行碎片也會導致性能下降

7.3.5.?行間碎片(Intra-row fragmentation)

7.3.5.1.?指邏輯上順序的頁或者行,在磁盤上不是順序存儲的

7.3.5.2.?對諸如全表掃描和聚簇索引掃描之類的操作有很大的影響,因為這些操作原本能夠從磁盤上順序存儲的數(shù)據中獲益

7.3.6.?剩余空間碎片(Free space fragmentation)

7.3.6.1.?指數(shù)據頁中有大量的空余空間

7.3.6.2.?導致服務器讀取大量不需要的數(shù)據,從而造成浪費

7.3.6.3.?可以通過執(zhí)行OPTIMIZE TABLE或者導出再導入的方式來重新整理數(shù)據

7.3.6.4.?對多數(shù)存儲引擎都是有效的

8.?原則

8.1.?單行訪問是很慢的,特別是在機械硬盤中存儲

8.1.1.?盡可能選擇合適的索引以避免單行查找

8.1.2.?SSD的隨機I/O要快很多,不過這一點仍然成立

8.2.?按順序訪問范圍數(shù)據是很快的

8.2.1.?順序I/O不需要多次磁盤尋道,所以比隨機I/O要快很多(特別是對于機械硬盤)

8.2.2.?如果服務器能夠按需順序讀取數(shù)據,那么就不再需要額外的排序操作,并且GROUP BY查詢也無須再做排序和將行按組進行聚合計算了

8.3.?索引覆蓋查詢是很快的

8.3.1.?如果一個索引包含了查詢需要的所有列,那么存儲引擎就不需要再回表查找行

8.4.?建議按響應時間來對查詢進行分析

8.4.1.?如果一個查詢無法從所有可能的索引中獲益,則應該看看是否可以創(chuàng)建一個更合適的索引來提升性能

到了這里,關于讀高性能MySQL(第4版)筆記09_創(chuàng)建高性能索引(下)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 讀高性能MySQL(第4版)筆記10_查詢性能優(yōu)化(上)

    讀高性能MySQL(第4版)筆記10_查詢性能優(yōu)化(上)

    4.11.1.1.?在存儲引擎層完成的 4.11.2.1.?直接從索引中過濾不需要的記錄并返回命中的結 4.11.2.2.?在MySQL服務器層完成的,但無須再回表查詢記錄 4.11.3.1.?在MySQL服務器層完成 4.11.3.2.?需要先從數(shù)據表中讀出記錄然后過濾 4.13.2.1.?使用單獨的匯總表 5.5.1.1.?定期清除大量數(shù)據時,

    2024年02月08日
    瀏覽(33)
  • 讀高性能MySQL(第4版)筆記11_查詢性能優(yōu)化(中)
  • 讀高性能MySQL(第4版)筆記12_查詢性能優(yōu)化(下)

    讀高性能MySQL(第4版)筆記12_查詢性能優(yōu)化(下)

    2.3.1.1.?讀取行指針和需要排序的字段,對其進行排序,然后再根據排序結果讀取所需要的數(shù)據行 2.3.1.2.?即需要從數(shù)據表中讀取兩次數(shù)據,第二次讀取數(shù)據的時候,因為是讀取排序列進行排序后的所有記錄,這會產生大量的隨機I/O,所以兩次傳輸排序的成本非常高 2.3.2.1.?先

    2024年02月08日
    瀏覽(22)
  • 讀高性能MySQL(第4版)筆記18_擴展MySQL

    讀高性能MySQL(第4版)筆記18_擴展MySQL

    4.2.2.1.?增加更多應用節(jié)點可以擴展服務用戶請求的客戶端數(shù) 4.2.2.2.?最終會被單源數(shù)據庫主機的能力所限制,該數(shù)據庫主機將要負責響應所有的讀取請求 4.2.2.3.?高CPU使用率意味著服務器正花費所有的時間處理查詢 4.2.2.4.?CPU的使用率越高,查詢的延遲也會越長 6.9.1.1.?負載均

    2024年02月08日
    瀏覽(22)
  • 讀高性能MySQL(第4版)筆記03_監(jiān)控

    讀高性能MySQL(第4版)筆記03_監(jiān)控

    7.1.1.1.?200響應代碼 7.1.2.1.?202已接受 10.3.2.1.?連接的線程數(shù)(threads_connected)很高,但運行的線程數(shù)(threads_running)仍然很低 10.3.3.1.?連接的線程數(shù)(threads_connected)和運行的線程數(shù)(threads_running)都處于高值并持續(xù)增加 10.5.1.1.?數(shù)據庫工程師不斷努力的目標之一

    2024年02月12日
    瀏覽(29)
  • 讀高性能MySQL(第4版)筆記02_MySQL架構(下)

    讀高性能MySQL(第4版)筆記02_MySQL架構(下)

    2.6.4.1.?失敗的事務可能導致不一致的結果,因為某些部分可以回滾,而其他部分不能回滾 5.1.1.1.?在表的.ibd文件中 5.1.1.2.?減少了I/O,非常高效 5.2.1.1.?分區(qū)定義 5.2.1.2.?表定義 5.2.1.3.?存儲程序定義 5.2.1.4.?字符集 5.2.1.5.?排序信息 5.2.2.1.?每個表的.ibd和.frm文件被替換為已經

    2024年02月12日
    瀏覽(19)
  • 讀高性能MySQL(第4版)筆記01_MySQL架構(上)

    讀高性能MySQL(第4版)筆記01_MySQL架構(上)

    1.2.2.1.?存儲過程 1.2.2.2.?觸發(fā)器 1.2.2.3.?視圖 3.3.2.1.?共享鎖(shared lock) 3.3.2.2.?資源上的讀鎖是共享的,或者說是相互不阻塞的 3.3.3.1.?排他鎖(exclusive lock) 3.3.3.2.?寫鎖則是排他的,也就是說,一個寫鎖既會阻塞讀鎖也會阻塞其他的寫鎖 3.3.3.3.?只有這樣才能確保在特定的

    2024年02月13日
    瀏覽(83)
  • 讀高性能MySQL(第4版)筆記16_復制(上)

    讀高性能MySQL(第4版)筆記16_復制(上)

    4.1.1.1.?通過記錄所有在源端執(zhí)行的數(shù)據變更語句來實現(xiàn)的 4.1.1.2.?簡單且緊湊 4.1.1.3.?一條更新了大量數(shù)據的SQL語句,在二進制日志中可能僅僅需要幾十字節(jié)存儲 4.1.1.4.?“不確定性”的SQL語句問題 4.1.1.4.1.?如果在源和副本上,記錄的排序不同,這條SQL語句在源和副本上刪除

    2024年02月08日
    瀏覽(20)
  • 讀高性能MySQL(第4版)筆記17_復制(下)

    讀高性能MySQL(第4版)筆記17_復制(下)

    1.3.1.1.?安全補丁 1.3.1.2.?內核更新 1.3.1.3.?一些配置選項更改后需要重新啟動才能生效 1.3.2.1.?確定將哪個副本切換為新的源 1.3.2.1.1.?一個包含所有數(shù)據的副本 1.3.2.2.?檢查延時,確保延時在秒級別 1.3.2.3.?通過設置super_read_only停止數(shù)據寫入源服務器 1.3.2.4.?等待副本與目標完

    2024年02月08日
    瀏覽(28)
  • 讀高性能MySQL(第4版)筆記14_備份與恢復(中)

    讀高性能MySQL(第4版)筆記14_備份與恢復(中)

    7.3.6.1.?消除了底層數(shù)據存儲引擎的差異 7.3.7.1.?如果MySQL在內存中的數(shù)據還沒有損壞,當不能得到一個正常的裸文件備份時,或許可以得到一個可以信賴的邏輯備份 7.4.1.1.?某些場景下比數(shù)據庫文件本身更大 7.4.2.1.?浮點表示的問題、軟件Bug等都會導致問題 7.4.3.1.?MySQL中導出數(shù)

    2024年02月08日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包