深入探究MySQL中使用where 1=1是否存在性能影響
前言
- 最近在項(xiàng)目中使用
mybatis 寫(xiě) SQL 使用了 where 1=1
來(lái)簡(jiǎn)化多條件拼接的寫(xiě)法,案例如下,借此聊聊多條件拼接的常見(jiàn)的一些寫(xiě)法以及where 1=1
是否存在性能影響。
<select id="" parameterType = ""> SELECT * FROM users WHERE 1=1 <if test="userName != null "> AND user_name = #{userName} </if> <if test="userAge != null "> AND user_age = #{userAge } </if> <if test="userSex!= null "> AND user_sex = #{userSex} </if> </select>
聊聊 mybatis 中多條件拼接的兩種常規(guī)寫(xiě)法
where 1=1
- 如前言中的示例:
<select id="" parameterType = ""> SELECT * FROM users WHERE 1=1 <if test="userName != null "> AND user_name = #{userName} </if> <if test="userAge != null "> AND user_age = #{userAge } </if> <if test="userSex!= null "> AND user_sex = #{userSex} </if> </select>
使用 <where> 標(biāo)簽
mybatis
提供<where>
標(biāo)簽,<where>
標(biāo)簽只有在一個(gè)以上的if條件有值的情況下才去插入WHERE
子句。若AND 或 OR
前沒(méi)有有效語(yǔ)句,where
元素會(huì)將它們?nèi)コ?/li>
<select id="" parameterType = ""> SELECT * FROM users <where> <if test="userName != null "> AND user_name = #{userName} </if> <if test="userAge != null "> AND user_age = #{userAge } </if> <if test="userSex!= null "> AND user_sex = #{userSex} </if> </where> </select>
性能影響
where 1=1
和<where>
標(biāo)簽兩種寫(xiě)法前者性能損耗在SQL查詢性能優(yōu)化
,后者在于SQL 語(yǔ)句動(dòng)態(tài)生成
。下面我們來(lái)具體分析一下:- MySQL 版本:
SELECT VERSION(); 5.7.44 # 數(shù)據(jù)構(gòu)造 SQL CREATE TABLE IF NOT EXISTS t_user ( id INT not null auto_increment primary key comment '自增ID', name varchar(20) comment '姓名', age tinyint comment '年齡' )ENGINE = INNODB; INSERT INTO t_user ( NAME, age ) VALUES ( '張三', 18 ),( '李四', 19 ),( '王五', 20 ),( '司總', 21 );
where 1=1
- 在 5.7 以上版本中,
SQL查詢性能優(yōu)化
會(huì)將1=1
部分優(yōu)化掉,并不會(huì)影響索引,但網(wǎng)上有部分資料說(shuō)在低版本中有一定影響,所以需要稍微留意一下。
# 注:需要選中一起執(zhí)行可以查看到優(yōu)化后的 SQL explain select * from t_user where 1=1 AND name = '張三'; show warnings; # 優(yōu)化后的 SQL /* select#1 */ SELECT `mydatabase`.`t_user`.`id` AS `id`, `mydatabase`.`t_user`.`name` AS `name`, `mydatabase`.`t_user`.`age` AS `age` FROM `mydatabase`.`t_user` WHERE ( `mydatabase`.`t_user`.`name` = '張三')
- 從優(yōu)化后的
SQL
可以看到,1=1
部分已經(jīng)被查詢優(yōu)化器優(yōu)化掉,所有對(duì)整體的性能影響并不大。
# 性能對(duì)比 select * from t_user where 1=1 AND name = '張三' > OK > 查詢時(shí)間: 0.046s select * from t_user where 1=1 > OK > 查詢時(shí)間: 0.046s
<where> 標(biāo)簽
- 相比于
where 1=1
在 MySQL 中服務(wù)器層由查詢優(yōu)化器進(jìn)行處理,<where>
標(biāo)簽在動(dòng)態(tài)構(gòu)建SQL
中處理,但性能也無(wú)很大影響,因?yàn)楸举|(zhì)并不是很復(fù)雜的動(dòng)態(tài)SQL
生成。
總結(jié)
where 1=1
和<where>
標(biāo)簽是多條件拼接的兩種常見(jiàn)寫(xiě)法,性能層面而言并沒(méi)有較大的影響,具體選擇何種寫(xiě)法可以根據(jù)團(tuán)隊(duì)的規(guī)范決定。- 此外兩種方案的處理與處理的數(shù)據(jù)量無(wú)關(guān),一次執(zhí)行都僅處理一次,所以在大數(shù)據(jù)量下也無(wú)性能差異。
以上就是深入探究MySQL中使用where 1=1是否存在性能影響的詳細(xì)內(nèi)容,更多關(guān)于MySQL where 1=1性能影響的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SQL實(shí)戰(zhàn)演練之網(wǎng)上商城數(shù)據(jù)庫(kù)用戶信息數(shù)據(jù)操作
一直認(rèn)為,扎實(shí)的SQL功底是一名數(shù)據(jù)分析師的安身立命之本,甚至可以稱得上是所有數(shù)據(jù)從業(yè)者的基本功。當(dāng)然,這里的SQL絕不單單是寫(xiě)幾條查詢語(yǔ)句那么簡(jiǎn)單,接下來(lái)請(qǐng)跟著小編通過(guò)案例項(xiàng)目進(jìn)一步提高SQL的能力吧2021-10-10Java的Struts框架中append標(biāo)簽與generator標(biāo)簽的使用
這篇文章主要介紹了Java的Struts框架中append標(biāo)簽與generator標(biāo)簽的使用方法,Struts是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12Mysql復(fù)合主鍵和聯(lián)合主鍵的區(qū)別解析
這篇文章主要介紹了Mysql復(fù)合主鍵和聯(lián)合主鍵的區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04MySQL 5.6.51 解壓版(zip版)安裝配置圖文方法
這兩天剛試用了一下MySQL5.6.51,感覺(jué)還不錯(cuò),有兄弟戲稱是一個(gè)高富帥版本?,F(xiàn)將MySQL5.6.51 zip解壓版本的安裝配置過(guò)程記錄如下,希望能給需要安裝該版本的朋友一點(diǎn)參考作用2015-08-08Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理(復(fù)制目錄或mysqldump備份)
Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理,新建目錄并復(fù)制壓縮,結(jié)合windows計(jì)劃任務(wù)方便實(shí)現(xiàn)每天的自動(dòng)備份2012-05-05MySQL查看數(shù)據(jù)庫(kù)表容量大小的方法示例
這篇文章主要介紹了MySQL查看數(shù)據(jù)庫(kù)表容量大小的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09MySQL插入數(shù)據(jù)insert?ignore語(yǔ)法重復(fù)數(shù)據(jù)自動(dòng)忽略
這篇文章主要給大家介紹了關(guān)于MySQL插入數(shù)據(jù)insert?ignore語(yǔ)法重復(fù)數(shù)據(jù)自動(dòng)忽略的相關(guān)資料,最近工作中使用到了insert ignore into語(yǔ)法,感覺(jué)這個(gè)語(yǔ)法還是挺有用的,就記錄下來(lái)做個(gè)總結(jié),需要的朋友可以參考下2023-08-08