一、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...