MySQL索引優化

MySQL索引優化

MySQL官方對索引的定義:索引是幫助MySQL高效獲取數據的數據結構。索引是在存儲引擎中實現的,所以每種存儲引擎中的索引都不一樣。如MYISAM和InnoDB存儲引擎只支持BTree索引;MEMORY和HEAP儲存引擎可以支持HASH和BTREE索引。

所以。。。。這裡僅針對常用的InnoDB存儲引擎所支持的BTree索引進行介紹:

一、索引類型

先創建一個新表,用於演示索引類型

CREATE TABLE index_table (

id BIGINT NOT NULL auto_increment COMMENT 主鍵,

NAME VARCHAR (10) COMMENT 姓名,

age INT COMMENT 年齡,

phoneNum CHAR (11) COMMENT 手機號,

PRIMARY KEY (id)

) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;

下圖是Col2為索引列,記錄與B樹結構的對應圖,僅供參考:

1、普通索引

這是最基本的索引,沒有任何限制。

------直接創建索引

create index index_name on index_table(name);

2、唯一索引

索引列的值必須唯一,可以有空值

---------直接創建唯一索引

create UNIQUE index index_phoneNum on index_table(phoneNum);

3、主鍵

是一種特殊的唯一索引,必須指定為 PRIMARY KEY,如我們常用的AUTO_INCREMENT自增主鍵

4、多列索引

也稱為組合索引,就是在多個欄位上聯合建立一個索引

-------直接創建組合索引

create index index_union on index_table(name,age,phoneNum);

這裡一個組合索引,相當於在有如下三個索引:

name;

name,age;

name,age,phoneNum;

這裡或許有這樣一個疑惑:為什麼age或者age,phoneNum欄位上沒有索引。這是由於BTree索引因要遵守最左前綴原則,這個原則在後面詳細展開。

二、索引優化

1、選擇索引列

創建索引簡單,但是在哪些列上創建索引則需要好好思考。可以考慮在where字句中出現列或者join字句中出現的列上建索引

SELECT

age----不使用索引

FROM

index_union

WHERE

NAME = xiaoming---考慮使用索引

AND phoneNum = 18668247687;---考慮使用索引

2、最左前綴原則

聯合索引(name,age,phoneNum) ,B+樹是按照從左到右的順序來建立搜索樹的。如(張三,18,18668247652)來檢索數據的時候,B+樹會優先匹配name來確定搜索方向,name匹配成功再依次匹配age、phoneNum,最後檢索到最終的數據。也就是說這種情況下是有三級索引,當name相同,查找age,age也相同時,去比較phoneNum;但是如果拿 (18,18668247652)來檢索時,B+樹沒有拿到一級索引,根本就無法確定下一步的搜索方向。(張三,18668247652)這種場景也是一樣,當name匹配成功後,沒有age這個二級索引,只能在name相同的情況下,去遍歷所有的phoneNum。

B+樹的數據結構決定了在使用索引的時候必須遵守最左前綴原則,在創建聯合索引的時候,盡量將經常參與查詢的欄位放在聯合索引的最左邊。

3、like的使用

一般情況下不建議使用like操作,如果非使用不可的話,需要注意:like %abd%不會使用索引,而like 『aaa%』可以使用索引。這也是前面的最左前綴原則的一個使用場景。

4、不能使用索引說明

mysql會按照聯合索引從左往右進行匹配,直到遇到範圍查詢,如:>,<,between,like等就停止匹配,a = 1 and b =2 and c > 3 and d = 4,如果建立(a,b,c,d)順序的索引,d是不會使用索引的。但如果聯合索引是(a,b,d,c)的話,則a b d c都可以使用到索引,只是最終c是一個範圍值。

5、order by

order by排序有兩種排序方式:using filesort使用演算法在內存中排序以及使用mysql的索引進行排序;我們在部分不情況下希望的是使用索引。

1select test_index where id = 3 order by id desc;

如果ID是單列索引,則order by會使用索引

1select test_index where id = 3 order by name desc;

如果ID是單列索引,name不是索引或者name也是單列索引,則order by不會使用索引。因為Mysql的一次查詢只會從眾多索引中選擇一個索引,而這次查詢中使用的是ID列索引,而不是name列索引。在這種場景下,如果想讓order by也使用索引的話,就建立聯合索引(id,name),這裡需要注意最左前綴原則,不要建立這樣的聯合索引(name,id)。

最後需要注意mysql對排序記錄的大小有限制:max_length_for_sort_data 默認為1024;也就意味著如果需要排序的數據量大於1024,則order by不會使用索引,而是使用using filesort。

然後~然後就結束啦~~~啦啦啦啦啦啦啦

本文地址:51test.space/archives/3

關注我們:請關注一下我們的微信公眾號:掃描二維碼

a

,公眾號:吾優測試

版權聲明:本文為原創文章,版權歸 吾優 所有,歡迎分享本文,轉載請保留出處!

你~可以~關注一下我的 上面有很多乾貨 如果有需要的話

當然 可以向我甩問題喲 哈哈哈


推薦閱讀:

DAY17:配置mac開發環境
如何才能讓自己看懂MySQL源碼,並且能夠自己寫出相應的patch?
如何快速了解資料庫,有否推薦書籍?
為何Redis用樂觀鎖,而MySQL資料庫卻沒有?
想非常精通資料庫的話需要哪方面數學?

TAG:MySQL | 測試 | 搜索引擎優化SEO |