mysql優化之like和=效能詳析
引言
那使用過資料庫的人大部分都知道,like和=號在功能上的相同點和不同點,那我在這裡簡單的總結下:
1,不同點:like可以用作模糊查詢,而'='不支援此功能;如下面的例子,查詢info表中欄位id第一個字母為1的資料:
select * from info where id like '1%';
2,相同點:like和"="都可以進行精確查詢,
比如下面的例子,從結果上看,都是查詢info表中欄位id等於'12345'的結果:
select * from info where id like '12345';
以上就是返回結果中,like和'='中的相同和不同點。那好奇的小夥伴可能就要問了,那執行過程呢?mysql不管是遇到like還是'='時的執行過程也都是一樣的麼?
沒錯,事情不能只看表面,如果你細心研究,就會發現其實like和等於號'='並不是那麼簡單,下面我們將詳細的分析他們兩者的真正區別~~~
正文
首先,我們來介紹一下mysql中的explain關鍵字;explain是執行計劃的意思,即通過該命令檢視這條sql是如何執行的。
使用方法也很簡單,即explain + sql語句,例如:
explain select * from info where id like '12345';
那我們來使用explain測試一下like和=下的查詢情況,首先我們來測試一下為索引的欄位:
EXPLAIN SELECT * FROM crms_customer WHERE id = '7cf79d7c8a3a4f94b5373b3ec392e32d';
而現在我們把"="換成like試一下:
EXPLAIN SELECT * FROM crms_customer WHERE id LIKE '7cf79d7c8a3a4f94b5373b3ec392e32d';
小夥伴通過對比可以看到兩條返回結果的type欄位和Extra欄位中的資料有所不同,那為什麼不同,他們所代表的含義是什麼呢?
type欄位
type欄位是一個可選值,這些值的效能從低到高的排序如下:
type | 說明 |
---|---|
SYSTEM | 系統,表僅有一行(=系統表)。這是const聯接型別的一個特例 |
CONST | 常量,表最多有一個匹配行,因為僅有一行,在這行的列值可被優化器剩餘部分認為是常數,const表很快,因為它們只讀取一次 |
EQ_REF | 搜尋時使用primary key 或 unique型別 |
REF | 根據索引查詢一個或多個值 |
INDEX_MERGE | 合併索引,使用多個單列索引搜尋 |
RANGE | 對索引列進行範圍查詢 |
index | 全索引表掃描 |
ALL | 全資料表掃描 |
根據表格可以明顯看出,其中const是常量查詢,而RANGE是對索引列進行範圍查詢,所以效能也就很明顯的體現了出來。
那使用like查詢時,Extra欄位代表什麼呢?Extra欄位中的Using where,又代表什麼?
Extra欄位
1,Extra欄位是Explain輸出中也很重要的列,所代表著MySQL查詢優化器執行查詢的過程中對查詢計劃的重要補充資訊。
2,Extra欄位中的Using where意味著mysql伺服器將在儲存引擎檢索行後再進行過濾。所以比起使用使用'='又多了一步查詢過程。
顯然通過以上的總結我們可以得出結論:當我們使用索引欄位進行條件查詢時,'='的效能要比like快。
是不是以為到這裡就結束了呢?
然而並沒有
有的小夥伴該問了那非索引欄位呢?
對的,我們下面繼續測試非索引欄位
EXPLAIN SELECT * FROM crms_customer WHERE customer_name = '張飛'; ----------------------------------- EXPLAIN SELECT * FROM crms_customer WHERE customer_name LIKE '張飛';
除了"="和like同樣的兩條語句,讓我們執行一下:
"=":
like:
可以看出當非索引欄位時like和"="是一樣的,效能上也沒有差別。
(當然,explain中還有很多其他欄位,後續我會一一給小夥伴們講解的。)
結論
經過我們的不懈努力,可以得到結論:當like和"="在使用非索引欄位查詢時,他們的效能是一樣的;而在使用索引欄位時,由於"="是直接命中索引的,只讀取一次,而like需要進行範圍查詢,所以"="要比like效能好一些。~~~~
到此這篇關於mysql優化之like和=效能的文章就介紹到這了,更多相關mysql like和=效能內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!