mysql優(yōu)化之like和=性能詳析
引言
那使用過(guò)數(shù)據(jù)庫(kù)的人大部分都知道,like和=號(hào)在功能上的相同點(diǎn)和不同點(diǎn),那我在這里簡(jiǎn)單的總結(jié)下:
1,不同點(diǎn):like可以用作模糊查詢(xún),而'='不支持此功能;如下面的例子,查詢(xún)info表中字段id第一個(gè)字母為1的數(shù)據(jù):
select * from info where id like '1%';
2,相同點(diǎn):like和"="都可以進(jìn)行精確查詢(xún),
比如下面的例子,從結(jié)果上看,都是查詢(xún)info表中字段id等于'12345'的結(jié)果:
select * from info where id like '12345';
以上就是返回結(jié)果中,like和'='中的相同和不同點(diǎn)。那好奇的小伙伴可能就要問(wèn)了,那執(zhí)行過(guò)程呢?mysql不管是遇到like還是'='時(shí)的執(zhí)行過(guò)程也都是一樣的么?
沒(méi)錯(cuò),事情不能只看表面,如果你細(xì)心研究,就會(huì)發(fā)現(xiàn)其實(shí)like和等于號(hào)'='并不是那么簡(jiǎn)單,下面我們將詳細(xì)的分析他們兩者的真正區(qū)別~~~
正文
首先,我們來(lái)介紹一下mysql中的explain關(guān)鍵字;explain是執(zhí)行計(jì)劃的意思,即通過(guò)該命令查看這條sql是如何執(zhí)行的。
使用方法也很簡(jiǎn)單,即explain + sql語(yǔ)句,例如:
explain select * from info where id like '12345';
那我們來(lái)使用explain測(cè)試一下like和=下的查詢(xún)情況,首先我們來(lái)測(cè)試一下為索引的字段:
EXPLAIN SELECT * FROM crms_customer WHERE id = '7cf79d7c8a3a4f94b5373b3ec392e32d';
而現(xiàn)在我們把"="換成like試一下:
EXPLAIN SELECT * FROM crms_customer WHERE id LIKE '7cf79d7c8a3a4f94b5373b3ec392e32d';
小伙伴通過(guò)對(duì)比可以看到兩條返回結(jié)果的type字段和Extra字段中的數(shù)據(jù)有所不同,那為什么不同,他們所代表的含義是什么呢?
type字段
type字段是一個(gè)可選值,這些值的性能從低到高的排序如下:
type | 說(shuō)明 |
---|---|
SYSTEM | 系統(tǒng),表僅有一行(=系統(tǒng)表)。這是const聯(lián)接類(lèi)型的一個(gè)特例 |
CONST | 常量,表最多有一個(gè)匹配行,因?yàn)閮H有一行,在這行的列值可被優(yōu)化器剩余部分認(rèn)為是常數(shù),const表很快,因?yàn)樗鼈冎蛔x取一次 |
EQ_REF | 搜索時(shí)使用primary key 或 unique類(lèi)型 |
REF | 根據(jù)索引查找一個(gè)或多個(gè)值 |
INDEX_MERGE | 合并索引,使用多個(gè)單列索引搜索 |
RANGE | 對(duì)索引列進(jìn)行范圍查找 |
index | 全索引表掃描 |
ALL | 全數(shù)據(jù)表掃描 |
根據(jù)表格可以明顯看出,其中const是常量查找,而RANGE是對(duì)索引列進(jìn)行范圍查找,所以性能也就很明顯的體現(xiàn)了出來(lái)。
那使用like查詢(xún)時(shí),Extra字段代表什么呢?Extra字段中的Using where,又代表什么?
Extra字段
1,Extra字段是Explain輸出中也很重要的列,所代表著MySQL查詢(xún)優(yōu)化器執(zhí)行查詢(xún)的過(guò)程中對(duì)查詢(xún)計(jì)劃的重要補(bǔ)充信息。
2,Extra字段中的Using where意味著mysql服務(wù)器將在存儲(chǔ)引擎檢索行后再進(jìn)行過(guò)濾。所以比起使用使用'='又多了一步查找過(guò)程。
顯然通過(guò)以上的總結(jié)我們可以得出結(jié)論:當(dāng)我們使用索引字段進(jìn)行條件查詢(xún)時(shí),'='的性能要比like快。
是不是以為到這里就結(jié)束了呢?
然而并沒(méi)有
有的小伙伴該問(wèn)了那非索引字段呢?
對(duì)的,我們下面繼續(xù)測(cè)試非索引字段
EXPLAIN SELECT * FROM crms_customer WHERE customer_name = '張飛'; ----------------------------------- EXPLAIN SELECT * FROM crms_customer WHERE customer_name LIKE '張飛';
除了"="和like同樣的兩條語(yǔ)句,讓我們運(yùn)行一下:
"=":
like:
可以看出當(dāng)非索引字段時(shí)like和"="是一樣的,性能上也沒(méi)有差別。
(當(dāng)然,explain中還有很多其他字段,后續(xù)我會(huì)一一給小伙伴們講解的。)
結(jié)論
經(jīng)過(guò)我們的不懈努力,可以得到結(jié)論:當(dāng)like和"="在使用非索引字段查詢(xún)時(shí),他們的性能是一樣的;而在使用索引字段時(shí),由于"="是直接命中索引的,只讀取一次,而like需要進(jìn)行范圍查詢(xún),所以"="要比like性能好一些。~~~~
到此這篇關(guān)于mysql優(yōu)化之like和=性能的文章就介紹到這了,更多相關(guān)mysql like和=性能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
開(kāi)啟bin-log日志mysql報(bào)錯(cuò)的解決方法
開(kāi)啟bin-log日志mysql報(bào)錯(cuò):This function has none of DETERMINISTIC, NO SQL解決辦法,大家參考使用吧2013-12-12mysql中l(wèi)ike % %模糊查詢(xún)的實(shí)現(xiàn)
這篇文章主要介紹了mysql中l(wèi)ike % %模糊查詢(xún)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12phpstudy安裝后mysql無(wú)法啟動(dòng)的解決
本文主要介紹了phpstudy安裝后mysql無(wú)法啟動(dòng)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03MySQL數(shù)據(jù)庫(kù)之字符集?character
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之字符集?character,文章基于MySQL的的相關(guān)資料展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下2022-05-05MySQL之終端Terminal(dos界面)管理數(shù)據(jù)庫(kù)、數(shù)據(jù)表、數(shù)據(jù)的基本操作
這篇文章主要介紹了MySQL之終端(Terminal)管理數(shù)據(jù)庫(kù)、數(shù)據(jù)表、數(shù)據(jù)的基本操作,需要的朋友可以參考下2015-03-03mysql更新一個(gè)表里的字段等于另一個(gè)表某字段的值實(shí)例
下面小編就為大家?guī)?lái)一篇mysql更新一個(gè)表里的字段等于另一個(gè)表某字段的值實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)
經(jīng)常在分組查詢(xún)之后,需要的是分組的某行數(shù)據(jù),例如更新時(shí)間最新的一條數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-10-10Mysql??DATEDIFF函數(shù)用法總結(jié)示例詳解
MySQL DATEDIFF()函數(shù)是MySQL中常見(jiàn)的日期函數(shù)之一,它主要用于計(jì)算兩個(gè)日期之間的差值,單位可以是天、周、月、季度和年,DATEDIFF函數(shù)用于返回兩個(gè)日期的天數(shù),這篇文章主要介紹了Mysql??DATEDIFF函數(shù),包括語(yǔ)法格式和示例代碼講解,需要的朋友可以參考下2023-03-03