Mysql索引優化

2022-06-09 22:24:12 字數 3228 閱讀 7255

在我們日常使用資料庫的時候,肯定避免不了對資料庫的優化。那麼對資料庫的優化又少了不索引的知識。

是的,建立索引能極大地提高查詢的效率。那麼你知道嗎,如果合理建立索引,可以更大地榨出資料庫的效能——也就等同於進一步提高查詢效率。

寫下這篇文章就是為了記錄一下對索引的優化,合理建立索引。

mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。

我們可以簡單理解為:快速查詢排好序的一種資料結構。mysql索引主要有兩種結構:b+tree索引和hash索引。

索引就相當於字典前的目錄,如果這個目錄劃分規劃更好,那麼我們找到想要的資料就會更方便,也就提高了查詢的效率。

索引的型別有:

索引不是越多越好,因為每次更新、插入資料,就需要對索引檔案進行變動,會減低該型別操作的執行效率。

如果建立索引的字段太多,影響就會很大。

所以我們只在合理的字段上建立索引

常見的可以用於建立索引的字段場景:

① 使用者id

在訂單表中的使用者id欄位上建立索引,根據使用者id篩選訂單,則會很快查詢出使用者的訂單。

使用者一般是在自己的後台檢視訂單,所以表中的其他使用者資料與他無關,如果沒有建立索引,每次查詢都是全表掃瞄,則會很慢。(我們每個人在**平台上佔的訂單比例都不到0.0001)

② 商品名

同上,如果不建立索引,我們在**輸入框搜尋鍵盤,怎麼快速查詢出鍵盤商品?

③ 日期

常用的活躍資料,一般都是是最近產生的,很少人沒事去翻半年前的訂單資料吧?

合適的還有很多很多場景,需要各位小夥伴自己好好思量。

並不是建立了索引就在查詢語句中生效。

上面舉例的一些場景都是比較容易理解的。組合索引還沒涉及,往下繼續介紹。

先來看一條語句

1select * from test where user_name ='siam_007'andcreate_time = 1563280050

假設在這個表中,user_name欄位和create_time都是建立了索引的。也沒有發生資料型別轉換等情況。

問題:該語句有幾個索引生效?

是2個嗎?並不是這樣子的。

雖然兩個欄位的索引都沒有問題,如果單獨使用也都能生效。

但是:mysql會從可用的索引中猜測出效率最高的乙個索引並使用它

怎麼證明?使用explain語句(詳解可以在網上其他資料找到)

只要在sql語句最前面加上該語法,則會顯示查詢型別相關的資訊。

我建立了兩個索引,都能用,都是本次查詢只能使用乙個。

基於這個情況,會引申出兩個知識點

先來說說組合索引吧,我們在新建索引的時候(視覺化軟體),是這樣子的頁面

當我們勾選上2個或者2個以上 就能把它叫為組合索引

可以看到還有調整順序的功能

在組合索引中,字段順序也是極為重要的。

假設我們有這樣乙個索引:new : a,b,c 字段

在查詢時使用where a = 1 and b = 2 and c= 3。那麼這個語句肯定是生效的。

如果我們使用where b = 2 and c =3沒有a條件 而a又是在組合索引中最左側的,那麼索引就不會生效。

還是要掃瞄全部行

where a,c where a,b where b,a,c這樣子使用都是可以生效的。

組合索引要注意字段順序,是指在建立索引時候的排序,而不是sql語句中where的順序,我們使用where b = 2 and a = 1 and c = 3也是 可以生效的

那麼組合索引的字段順序要如何排比較好?

後面會有新的一篇文章會講這個

如果我們在表中,擁有兩個索引,比如user_name 使用者名稱, user_phone 使用者手機號

現在有這樣子的資料量:

100w條資料 user_name=』我是使用者名稱』

100條資料 user_phone=』110′

5條資料 user_name=』我是使用者名稱』 and user_phone=』110′

假設有這樣子一條語句:

1select * from test where user_name ='我是使用者名稱'anduser_phone='110'

有兩個欄位都有索引可用,mysql會選擇乙個使用。這是屬於mysql的內部處理判斷

正常情況下,如果用user_phone索引生效的話,會很快得到結果(先篩選出100條 再篩選)

如果user_name生效,則要先篩選100w條資料,再篩選user_phone

mysql的內部判斷可能使得user_name索引生效,此時效率就會很低了,我們可以強制使用某個索引

phone是索引名 是新建的時候填的

1select * from test index(phone) where user_name ='我是使用者名稱'anduser_phone='110'

此種情況出現的概率比較小,畢竟mysql的直譯器很複雜,也做了足夠多的優化。只有排查慢日誌並且分析確定索引衝突的情況才需要強制使用索引。

mysql 優化 聚集索引 mysql 索引優化

一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...

mysql索引優化原則 MySQL 索引優化原則

索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...

mysql索引優化原則 MySQL索引優化

mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...