搜尋
首頁資料庫mysql教程mysql如何進行sql優化?
mysql如何進行sql優化?Sep 27, 2020 pm 05:37 PM
mysql

mysql進行sql優化的方法:1、避免全表掃描,在where及order by涉及的列上建立索引;2、在where子句中避免對字段進行null值判斷,避免使用“ !=”或“”操作符,避免使用or來連接條件;3、慎用in和not in。

mysql如何進行sql優化?

 MySQL中的SQL的常見最佳化策略

1 避免全表掃描

對查詢進行最佳化,應盡量避免全表掃描,首先應考慮在where 及order by 涉及的列上建立索引。

2 避免判斷null值
應盡量避免在where 子句中對欄位進行null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設定預設值0,確保表中num 列沒有null值,然後這樣查詢:
##

select id from t where num=0

#3 避免不等值判斷

應盡量避免在where 子句中使用!=或運算符,否則引擎將放棄使用索引而進行全表掃描。

4 避免使用or邏輯#應盡量避免在where 子句中使用or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:


select id from t where num=10
union all
select id from t where num=20

5 慎用in和not in邏輯in 和not in 也要慎用,否則會導致全表掃描,如:
select id from t1 where num in(select id from t2 where id > ; 10)
此時外層查詢會全表掃描,不使用索引。可以修改為:
select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id
此時索引被使用,可以明顯提升查詢效率。

6 注意模糊查詢下面的查詢也會導致全表掃描:
select id from t where name like '�c%'
模糊查詢如果是必要條件時,可以使用select id from t where name like 'abc%'來實作模糊查詢,此時索引將會被使用。如果頭匹配是必要邏輯,建議使用全文搜尋引擎(Elastic search、Lucene、Solr等)。

7 避免查詢條件中欄位計算#應盡量避免在where 子句中對欄位進行表達式運算,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2

8 避免查詢條件中對欄位進行函數操作#應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
應改為:
select id from t where name like 'abc% '

9 WHERE子句「=」左邊注意點不要在where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

10 組合索引使用#在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到此索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相符。

11 不要定義無異議的查詢#不要寫一些沒有意義的查詢,如需要產生一個空表結構:
select col1,col2 into #t from t where 1=0
這類程式碼不會傳回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(. ..)

12 exists#很多時候用exists 取代in 是個好的選擇:
select num from a where num in(select num from b)
用下面的語句取代:
select num from a where exists(select 1 from b where num=a.num)

13 索引也可能失效
並不是所有索引對查詢都有效,SQL是根據資料表中資料來進行查詢最佳化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。

14 表格字段類型選擇
#盡量使用數字型字段,若只含數值資訊的字段盡量不要設計為字符型,這會降低查詢和連接的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連接時會逐個比較字串中每一個字符,而對於數字型而言只需要比較一次就夠了。
盡可能的使用 varchar 代替 char ,因為首先可變長度字段存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

15 查詢語法中的欄位
#任何地方都不要使用select * from t ,用具體的欄位清單取代“ *”,不要傳回用不到的任何欄位。

16 索引無關優化
#不使用*、盡量不使用union,union all等關鍵字、盡量不使用or關鍵字、盡量使用等值判斷。

表格連接建議不超過5個。如果超過5個,則考慮表格的設計。 (在互聯網應用中)

表連接方式使用外聯優於內聯。
外連線有基礎資料存在。如:A left join B,基礎數據是A。 
A inner join B,沒有基礎資料的,先使用笛卡爾積完成全連接,在根據連接條件得到內連接結果集。

大資料量級的表格做分頁查詢時,如果頁碼數量過大,則使用子查詢來配合完成分頁邏輯。
Select * from table limit 1000000, 10
Select * from table where id in (select pk from table limit 100000, 10)

以上是mysql如何進行sql優化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

mysql怎么删除unique keymysql怎么删除unique keyMay 12, 2022 pm 03:01 PM

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。