sql調(diào)優(yōu)的幾種方式小結(jié)
sql調(diào)優(yōu)的幾種方式:避免使用select *、用union all 代替union、小表驅(qū)動(dòng)大表、批量操作、多用limit、in中值太多、增量查詢、高效的分頁、用鏈接查詢代替子查詢、join數(shù)量不宜過多、join時(shí)需要注意、控制索引的數(shù)量、選擇合理的字段類型、提升group by的效率、索引優(yōu)化。
1、避免使用select *
select *會(huì)查詢所以字段,實(shí)際業(yè)務(wù)場景中不需要所有的字段,可以不進(jìn)行查詢。
2、用union all 代替union
union會(huì)排重,排重過程需要遍歷,排序,比較,更消耗cpu資源。在確定唯一,沒有重復(fù)數(shù)據(jù)的情況下,盡量用用union all。
3、小表驅(qū)動(dòng)大表
in 的話里面驅(qū)動(dòng)外面,in適合里子查詢是小表
exist 的話外面驅(qū)動(dòng)里面,適合外面是小表
4、批量插入
當(dāng)然一次插入量也不能太大,可以分批插入。
5、使用limit
在不需要獲取全部記錄的情況下,使用limit獲取指定數(shù)量。
6、in中值太多
查詢出來數(shù)量太大,限制一次最大查詢條數(shù)
還可以,多線程查詢,最后把查詢出來的數(shù)據(jù)匯總。
7、增量查詢
select name,age from user where id>#{lastId} limit 100;查詢比上次id 大的100條
8、高效的分頁
select id,name,age from user limit 10000, 20;
mysql會(huì)查詢10020條,然后丟棄前面10000條,這個(gè)比較浪費(fèi)資源
可以優(yōu)化:
select id,name,age from user id>10000 limit 20;
找到上次分頁最大id
假如id是連續(xù)的,并且有序,可以用between
注意: between要在唯一索引上分頁,不然會(huì)出現(xiàn)每頁大小不一致問題。
9、用連接查詢代替子查詢
MySQL如果需要在兩張以上表中查詢數(shù)據(jù)的話,一般有兩種實(shí)現(xiàn)方式
子查詢
連接查詢
select * from order where user_id in (select id from user where name='vie');
子查詢可以通過in實(shí)現(xiàn),優(yōu)點(diǎn):這樣簡單,
但缺點(diǎn)是,MySQL執(zhí)行子查詢時(shí),需要?jiǎng)?chuàng)建臨時(shí)表,查詢完成后再刪除臨時(shí)表,有一些額外開銷。
可以改成連接查詢:
select o.* from order o inner join user u on o.user_id = u.id where u.name='vie';
10、join表不宜過多
join表不宜超過3個(gè),如果join太多,MySQL在選擇索引時(shí)會(huì)非常復(fù)雜,很容易選錯(cuò)索引。
并且沒有命中,nested loop join 就會(huì)分別從兩個(gè)表讀一行數(shù)據(jù)進(jìn)行對比,時(shí)間復(fù)雜度n^2。
11、join時(shí)需要注意
join用的最多的時(shí)left join 和 inner join
left join:兩個(gè)表的交集和左表的剩余數(shù)據(jù)
inner join:兩個(gè)表的交集
inner join mysql會(huì)自動(dòng)選擇小表驅(qū)動(dòng),
left join 左邊的表驅(qū)動(dòng)右邊的表
12、控制索引數(shù)量
索引不是越多越好,索引需要額外的存儲(chǔ)空間,B+樹保存索引,額外的性能消耗。
單表索引數(shù)量盡量控制在5個(gè)以內(nèi),且單個(gè)索引字段數(shù)量控制在5個(gè)以內(nèi)。
13、選擇合理的字段類型
能用數(shù)字類型就不用字符串,字符串處理速度比數(shù)字類型慢
14、提升group by效率
主要功能去重,分組
先過濾數(shù)據(jù),減少數(shù)據(jù),再分組
select id, name ,age from user group by id having id <50;
這種寫法就不好,建議以下寫法:
select id, name ,age from user where id <50 group by id;
15、索引優(yōu)化
強(qiáng)制走哪個(gè)索引
select * from user force index(索引)
到此這篇關(guān)于sql調(diào)優(yōu)的幾種方式小結(jié)的文章就介紹到這了,更多相關(guān)sql調(diào)優(yōu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過T-SQL語句創(chuàng)建游標(biāo)與實(shí)現(xiàn)數(shù)據(jù)庫加解密功能
這篇文章介紹了通過T-SQL語句創(chuàng)建游標(biāo)與實(shí)現(xiàn)數(shù)據(jù)庫加解密功能的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
Windows開啟SQL?Server服務(wù)及1433端口詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于Windows開啟SQL?Server服務(wù)及1433端口的相關(guān)資料,通常端口值是1433,因?yàn)?433是sql server 2000的對于Tcp/IP的默認(rèn)偵聽端口,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
SQL?Server使用表值參數(shù)的實(shí)現(xiàn)示例
表值參數(shù)提供了一種將多行數(shù)據(jù)作為參數(shù)傳遞給存儲(chǔ)過程或函數(shù)的方法,本文主要介紹了SQL?Server使用表值參數(shù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
SQL中聚類后字段數(shù)據(jù)串聯(lián)字符串方法常見示例代碼
這篇文章主要介紹了SQL中聚類后字段數(shù)據(jù)串聯(lián)字符串方法常見的方法,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-01-01
SQL Server數(shù)據(jù)庫按百分比查詢出表中的記錄數(shù)
這篇文章主要介紹了SQL Server數(shù)據(jù)庫在一個(gè)表中按百分比查詢出記錄條數(shù)的方法及代碼示例,需要的朋友可以參考下2015-08-08
SQL?Server中row_number函數(shù)用法入門介紹
SQL?ROW_NUMBER函數(shù)是臨時(shí)值序列的非持久生成,并且在執(zhí)行查詢時(shí)會(huì)動(dòng)態(tài)計(jì)算該函數(shù),下面這篇文章主要給大家介紹了關(guān)于SQL?Server中row_number函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2023-03-03
sql將時(shí)間類型轉(zhuǎn)換為字符串類型匯總
這篇文章介紹了sql將時(shí)間類型轉(zhuǎn)換為字符串類型,有需要的朋友可以參考一下2013-09-09
SQL SERVER2012中新增函數(shù)之字符串函數(shù)CONCAT詳解
SQL Server 2012有一個(gè)新函數(shù),就是CONCAT函數(shù),連接字符串非它莫屬。比如在它出現(xiàn)之前,連接字符串是使用"+"來連接,如遇上NULL,還得設(shè)置參數(shù)與配置,不然連接出來的結(jié)果將會(huì)是一個(gè)NULL。本文就介紹了關(guān)于SQL SERVER 2012中CONCAT函數(shù)的相關(guān)資料,需要的朋友可以參考。2017-03-03
深入解析SQL SELECT TOP 語句的實(shí)現(xiàn)
SELECT TOP用于限制查詢結(jié)果行數(shù),本文就來詳細(xì)的介紹一下SQL SELECT TOP 語句的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03

