當前位置:成語大全網 - 漢語詞典 - MYSQL數據庫的索引類型有哪些?

MYSQL數據庫的索引類型有哪些?

在滿足語句要求的情況下,盡可能少的訪問資源是數據庫設計的壹個重要原則,這與執行的SQL直接相關,而索引問題是SQL問題中出現頻率最高的。常見的索引問題包括:無索引(失效)和隱式轉換。

1.SQL執行過程看問題。在下面的表T中,如果我想執行select * from t其中3和5之間;妳需要搜索樹多少次?妳要掃描多少行?mysql & gt創建表T(-& gt;ID int主鍵,-& gt;k int NOT NULL缺省值為0,-& gt;s varchar(16)NOT NULL DEFAULT ' ',-& gt;指數k(k))-& gt;engine = InnoDBmysql & gt插入T值(100,1,' aa '),(200,2,' bb '),\?(300,3,' cc '),(500,5,' ee '),(600,6,' ff '),(700,7,' gg ');

它們分別是ID字段索引樹和K字段索引樹。?

這條SQL語句的執行過程:

1.在K索引樹中找到k=3,得到ID=3002。回到ID索引樹,找到ID=300的記錄,對應R33。在K索引樹中查找k=5且ID=5004的下壹個值。回到ID索引樹,找到ID=500的R4。

5.從K索引樹中移除下壹個值k=6。如果條件不滿足,循環結束。

這個過程讀取K索引樹的三條記錄,並返回表兩次。因為查詢結果需要的數據只存在於主鍵索引中,所以必須返回到表中。那麽,如何通過優化索引來避免回表呢?

2.通用索引優化2.1覆蓋索引覆蓋索引,換句話說,索引覆蓋我們的查詢請求,而不返回表。

如果執行的語句是select id from whenek介於3和5之間;在這種情況下,因為ID的值在K索引樹中,所以不需要返回表。

覆蓋索引可以減少樹搜索的次數,顯著提高查詢性能,是壹種常用的性能優化方法。

然而,維護索引是有代價的,所以在構建冗余索引以支持覆蓋索引時,我們應該權衡利弊。

2.2最左側前綴原則

B+樹的數據項是復雜的數據結構。例如,當使用(姓名,性別,年齡)時,B+樹從左到右建立搜索樹。在搜索(張三,F,26)等數據時,B+樹會先比較名字,確定下壹步的搜索方向。如果名字相同,那麽依次比較性別和年齡,最後得到檢索到的數據。

#有這麽壹個表p。

mysql & gt創建表P (id int主鍵,name varchar(10) not null,sex varchar(1),age int,index tl(name,sex,age))engine = IInnoDB;

mysql & gt插入P值(1,'張三',' F ',26),(2,'張三',' M ',27),(3,'李四',' F ',28),(4,'簡自豪',' F '

#以下語句具有相同的結果。

mysql & gtSelect * from P其中name= '張三',sex = ' F## A1

mysql & gtselect * from P其中性別='F ',年齡= 26;## A2

#解釋看壹看

mysql & gt解釋select * from P其中name= '張三',sex = ' F

+ - + - + - + - + - + - + - + - + - + - + - + - +

| id | select _ type | table | partitions | type | possible _ key | key?| key _ len | ref | rows | filtered | Extra?|

+ - + - + - + - + - + - + - + - + - + - + - + - +

| ?1 |簡單?| P | NULL?| ref?| tl | tl?| 38 ?| const,const | 1 |?100.00 |使用索引|

+ - + - + - + - + - + - + - + - + - + - + - + - +

mysql & gt解釋select * from P其中性別='F ',年齡= 26;

+ - + - + - + - + - + - + - + - + - + - + - + - +

| id | select_type |表|分區|類型?|可能鍵|鍵?| key_len | ref?|行|過濾的|額外的|

+ - + - + - + - + - + - + - + - + - + - + - + - +

| ?1 |簡單?| P | NULL?| index | NULL?| tl?| 43 ?| NULL | 6 | 16.67 |使用where使用索引|

+ - + - + - + - + - + - + - + - + - + - + - + - +

可以清楚的看到,A1使用的是tl索引,A2掃描的是全表。雖然A2的兩個條件都出現在tl索引中,但是沒有使用name列,不符合最左前綴原則,所以索引不能使用。因此,在建立聯合索引時,如何安排索引中的字段排序是關鍵。評價標準是指標可重用性。因為支持最左邊的前綴,所以在建立了聯合索引(A,B)之後,不需要為A建立單獨的索引。原則上,如果通過調整順序可以保持少壹個索引,那麽這個順序往往是首選的。在上面的例子中,如果查詢條件中只有B,那麽聯合索引(A,B)就無法使用,這時就不得不維護另壹個索引,也就是說必須同時維護(A,B)和(B)兩個索引。在這種情況下,需要考慮空間占用。例如,姓名和年齡的聯合索引比年齡字段占用更多的空間,因此創建(姓名,年齡)聯合索引和(年齡)索引所占用的空間小於(年齡,姓名)和(姓名)索引所占用的空間。2.3指數下推

以人員表的聯合索引(姓名、年齡)為例。如果現在有要求:從表中檢索名字為張且年齡為26歲的所有男性。所以,SQL語句是這樣寫的MySQL >;Select * from tuser其中姓名如“張%”,年齡=26,性別=男;

通過最左邊的前綴索引規則,會找到ID1,然後需要判斷MySQL 5.6之前是否滿足其他條件,只能從ID1開始壹個壹個返回表。轉到主鍵索引查找數據行,然後比較字段值。MySQL 5.6引入的索引條件下推可以在索引遍歷的過程中先判斷索引包含的字段,直接過濾掉不符合條件的記錄,減少表返回的次數。這樣減少了表返回的次數和之後重新過濾的工作量,檢索速度明顯提高。2.4隱式類型轉換

隱式類型轉換的主要原因是表結構中指定的數據類型與傳入的數據類型不同,導致索引不可用。所以有兩種方案:修改表結構和修改字段數據類型。修改應用程序,將應用程序中傳遞的字符類型更改為與表結構相同的類型。

3.為什麽選擇了錯誤的索引3.1優化器選擇索引,這是優化器的工作,它的目的是找到壹個最優的執行方案,以最小的代價執行語句。在數據庫中,掃描的行數是影響執行成本的因素之壹。掃描的行數越少,訪問磁盤數據的次數就越少,消耗的CPU資源就越少。當然,掃描的行數不是唯壹的標準,優化器還會根據是否使用臨時表、是否排序等因素進行綜合判斷。3.2掃描的行數

MySQL在真正開始執行語句之前無法確切知道有多少條記錄滿足這個條件,只能通過索引的判別來判斷。顯然,壹個指數中不同值越多,指數的區分度越好,壹個指數中不同值的個數稱為“基數”,即基數越大,指數的區分度越好。#通過show index方法檢查索引MySQL > >的基數。顯示t的索引;+-+-+-+-+-+-+-+-+-+-+-+-+| Table | Non _ unique | Key _ name | Seq _ in _ Index | Column _ name | Collation | Cardinality | Sub _ part | Packed | Null | Index _ type | Comment | Index _ Comment |+--+-+-+-+-+-+-+-+| t |?0 |主要?| 1 | id?|壹|?95636 | NULL | NULL?| ?| BTREE?| | ?|| t |?1 | a | 1 | a?|壹|?96436 | NULL | NULL?|是嗎?| BTREE?| | ?|| t |?1 | b | 1 | b?|壹|?96436 | NULL | NULL?|是嗎?| BTREE?| | ?|+ - + - + - + - + - + - + - + - + - + - + - + - + - +

MySQL使用抽樣統計來估計基數:抽樣統計時,InnoDB會默認選擇N個數據頁,統計這些頁上的不同值,得到壹個平均值,然後乘以這個索引的頁數,得到這個索引的基數。數據表會不斷更新,索引統計不會固定。所以當變更數據行數超過1/M時,會自動觸發再次做索引統計。在MySQL中,有兩種存儲索引統計信息的方法,可以通過設置參數innodb_stats_persistent的值來選擇:

On表示將永久存儲統計數據。默認值為N = 20,M = 10。

Off表示統計數據只存儲在內存中。默認值為N = 8,M = 16。

因為是抽樣統計,不管n是20還是8,這個基數很容易不準確。所以,是由於未能準確確定掃描行數,導致MySQL選錯了索引。您可以使用分析表來重新計算索引信息並進行更正。

分析[LOCAL | NO_WRITE_TO_BINLOG]表tbl_name [,tbl_name]...

3.3指標選擇和處理異常1。強制索引用於強制選擇壹個索引。2.我們可以考慮修改語句,引導MySQL使用我們期望的索引。3.在某些情況下,您可以創建壹個更適合優化器選擇的索引,或者刪除誤用的索引。