亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入探究MySQL中使用where 1=1是否存在性能影響

 更新時(shí)間:2024年02月20日 11:00:21   作者:Lorin洛林  
最近在項(xiàng)目中使用 mybatis 寫(xiě) SQL 使用了 where 1=1 來(lái)簡(jiǎn)化多條件拼接的寫(xiě)法,案例如下,借此聊聊多條件拼接的常見(jiàn)的一些寫(xiě)法以及 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)文章

  • 安裝mysql noinstall zip版

    安裝mysql noinstall zip版

    沒(méi)用過(guò)mysql, 這幾天折騰django ,發(fā)現(xiàn)連接mssql好像還是有些小bug,為了防止日后項(xiàng)目有些莫名的db故障,故選擇django推薦之一的mysql
    2011-12-12
  • SQL實(shí)戰(zhàn)演練之網(wǎng)上商城數(shù)據(jù)庫(kù)用戶信息數(shù)據(jù)操作

    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-10
  • Java的Struts框架中append標(biāo)簽與generator標(biāo)簽的使用

    Java的Struts框架中append標(biāo)簽與generator標(biāo)簽的使用

    這篇文章主要介紹了Java的Struts框架中append標(biāo)簽與generator標(biāo)簽的使用方法,Struts是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • MySQL數(shù)據(jù)處理梳理講解增刪改的操作

    MySQL數(shù)據(jù)處理梳理講解增刪改的操作

    本篇文章旨在介紹如何使用數(shù)據(jù)處理函數(shù),和其他大多數(shù)計(jì)算機(jī)語(yǔ)言語(yǔ)言,MYSQL支持利用函數(shù)來(lái)處理數(shù)據(jù),函數(shù)也就是一般在數(shù)據(jù)上執(zhí)行,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便
    2022-05-05
  • Mysql復(fù)合主鍵和聯(lián)合主鍵的區(qū)別解析

    Mysql復(fù)合主鍵和聯(lián)合主鍵的區(qū)別解析

    這篇文章主要介紹了Mysql復(fù)合主鍵和聯(lián)合主鍵的區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • MySQL中常用的一些日期和時(shí)間函數(shù)

    MySQL中常用的一些日期和時(shí)間函數(shù)

    MySQL日期和時(shí)間函數(shù)是MySQL中的一個(gè)重要組件,它提供了一些有用的函數(shù)來(lái)處理日期和時(shí)間數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于MySQL中常用的一些日期和時(shí)間函數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • MySQL 5.6.51 解壓版(zip版)安裝配置圖文方法

    MySQL 5.6.51 解壓版(zip版)安裝配置圖文方法

    這兩天剛試用了一下MySQL5.6.51,感覺(jué)還不錯(cuò),有兄弟戲稱是一個(gè)高富帥版本?,F(xiàn)將MySQL5.6.51 zip解壓版本的安裝配置過(guò)程記錄如下,希望能給需要安裝該版本的朋友一點(diǎn)參考作用
    2015-08-08
  • Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理(復(fù)制目錄或mysqldump備份)

    Windows下實(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-05
  • MySQL查看數(shù)據(jù)庫(kù)表容量大小的方法示例

    MySQL查看數(shù)據(jù)庫(kù)表容量大小的方法示例

    這篇文章主要介紹了MySQL查看數(shù)據(jù)庫(kù)表容量大小的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • MySQL插入數(shù)據(jù)insert?ignore語(yǔ)法重復(fù)數(shù)據(jù)自動(dòng)忽略

    MySQL插入數(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

最新評(píng)論