mysql資料庫優化索引 mysql資料庫索引調優

2021-10-18 11:22:10 字數 3177 閱讀 6427

一、mysql索引

1、磁碟檔案結構

innodb引擎:frm格式檔案儲存表結構,ibd格式檔案儲存索引和資料。

myisam引擎:frm格式檔案儲存表結構,myi格式檔案儲存索引,myd格式檔案儲存資料

2、mysql資料庫資料範問原理(innodb、btree)

(1)ibd檔案中主鍵構建b+tree,主鍵樹的葉子結點包含了所有的主鍵值,儲存主鍵值和對應的表資料

(2)其他索引構建b+tree,樹的葉子結點包含了所有該索引欄位的值,儲存索引值和主鍵值。

原理圖如下圖所示:

3、索引型別

普通索引:無任何限制的索引

唯一索引:列值唯一的索引,可以為空值

主鍵索引:表的主鍵,特殊的唯一性索引,不能為空值

組合索引:多個欄位上的索引,遵循左字首集合

全文索引:來查詢文字中的關鍵字

4、使用explain+sql語句進行調優

(1)explain包含的資訊包含:

主要從id、type、key、rows、extra分析。

(2)id

表示執行的先後順序,id值大的先執行,小的後執行,id值相同的從上到下執行。

(3)type

訪問型別,結果值從好到壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。

建議盡量達到range級別,常見型別介紹如下:

const:通過索引一次找到,通常用於主鍵或唯一性索引。

eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵 或 唯一索引掃瞄。

ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行。

range:只檢索給定範圍的行,使用乙個索引來選擇行。key列顯示使用了那個索引。一般就是在where語句**現了bettween、、in等的查詢。

index:index與all雖然都是讀全表,但index是從索引中讀取,而all是從硬碟讀取。

all:full table scan,遍歷全表以找到匹配的行 。

(4)key

實際使用的索引,如果為null,則沒有使用索引。查詢中如果使用了覆蓋索引,則該索引僅出現在key列表中 。

(5)rows

根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數。

(6)extra

using index: 表示相應的select操作中使用了覆蓋索引(covering index),避免了訪問表的資料行,效率高 。using where,表明索引被用來執行索引鍵值的查詢,如果沒用同時出現using where,表明索引用來讀取資料而非執行查詢動作。

using  where:表示使用了where條件過濾。

convering index:覆蓋索引表示直接從索引中讀取資料,sql中查詢字段、where條件等涉及的字段都在覆蓋索引包含的字段裡面。

using index condition:優化器在索引存在情況下通過符合range範圍的條數和總數比例來確定進行索引還是全表遍歷。

using filesort:無法利用索引完成的排序操作。

using temporary:使用臨時表儲存中建結果,如order by和group by,出現臨時表需要優化sql。

5、組合索引

(1)使用組合索引時需要遵循索引最左匹配原則,使用了最左原則type可以為eq_ref (組合索引為唯一索引)、ref、index,可以使用演算法來

查詢索引值。如果組合索引為(a,b),使用where a ='value'或者where a ='value' and b='value1'時type為ref。

(2)使用組合索引時需要遵循索引最左匹配原則,沒有使用了最左原則type可以為index,直接掃瞄索引全表查詢索引值。如果組合索引為(a,b),使用where b ='value1'或者where a ='value' or b ='value1' 時type為index。

(3)組合索引和多個單列索引

在(a,b,c)3列上建立組合索引和3個單列索引時,where條件為a、b、c3列時,組合索引效能更優,3個單列索引只會走乙個最優的單列索引。

6、mysql不走索引的原因

1) 沒有查詢條件,或者查詢條件沒有建立索引。

2) 在查詢條件上沒有使用引導列。

3) 查詢的數量是大表的大部分,應該是30%以上。

4) 索引本身失效。

5) 查詢條件使用函式在索引列上,或者對索引列進行運算,運算包括(+,-,*,/,! 等)

錯誤的例子:select * from test where id-1=9; 正確的例子:select * from test where id=10。

6) 對小表查詢。

10)隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤。

由於表的字段tel_num定義為varchar2(20),但在查詢時把該字段作為number型別以where條件傳給資料庫,這樣會導致索引失效,

錯誤的例子:select * from test where tel_nume=13333333333;正確的例子:select * from test where tel_nume='13333333333'。

11) 注意使用的特殊符號

1、<>  、!=。

2、單獨的》,

12)like "%_" 百分號在前.

select * from t1  where name like 'linux培訓%'。

13) not in ,not exist。

15)當變數採用的是times變數,而表的字段採用的是date變數時.或相反情況。

16)b-tree索引is null不會走,is not null會走。

17)聯合索引 is not null 只要在建立的索引列(不分先後)都會走

in null時 必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,其他建立索引的列可以是is null(但必須在所有列 都滿足is null的時候),或者=乙個值;當建立索引的第一位置是=乙個值時,其他索引列可以是任何情況(包括is null =乙個值),以上兩種情況索引都會走。其他情況不會走。

mysql資料庫優化之索引優化

一 如何選擇合適的列建立索引 1 一般會選擇在where從句中,group by從句中,order by從句中 join on 從句中,建立索引,在特殊情況下select 從句中,所出的列,進行索引,當乙個索引包含了查詢中的所有列,那麼稱之為這樣的索引為覆蓋索引,當我們的查詢執行的頻率非常高,並且索...

mysql資料庫索引優化策略

1.myisam,innodb錶用的都是b tree索引,都是 排好序的快速查詢結構 2.memory錶用的是hash索引 3.優缺點 1 hash索引的查詢理論的時間複雜度是0,但是無法對範圍查詢進行優化,無法對排序進行優化,必須回行取資料,無法i用字首索引 2 b tree可以利用做字首進行優化...

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...