亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

分享9條高頻SQL優(yōu)化技巧

admin
2024年9月10日 0:4 本文熱度 1793

1.避免使用select *

在實際業(yè)務場景中,可能我們真正需要使用的只有其中一兩列。

但我們寫sql語句時,為了方便,喜歡直接使用select *,一次性查出表中所有列的數(shù)據(jù)。多查出來的數(shù)據(jù),通過網(wǎng)絡IO傳輸?shù)倪^程中,也會增加數(shù)據(jù)傳輸?shù)臅r間。

還有一個最重要的問題是:select *不會走覆蓋索引,會出現(xiàn)大量的回表操作,而從導致查詢sql的性能很低。

2.小表驅(qū)動大表

小表驅(qū)動大表,即用小表的數(shù)據(jù)集驅(qū)動大表的數(shù)據(jù)集。

假如有order和user兩張表,其中order表有10000條數(shù)據(jù),而user表有100條數(shù)據(jù)。

這時如果想查一下,所有有效的用戶下過的訂單列表。

可以使用in關鍵字實現(xiàn):

select  *  from  order  where  user_id  in  (select  id  from  user  where  status=1)

sql語句中包含了in關鍵字,則它會優(yōu)先執(zhí)行in里面的子查詢語句,然后再執(zhí)行in外面的語句。如果in里面的數(shù)據(jù)量很少,作為條件查詢速度更快。

3.避免in中值太多

對于批量查詢接口,我們通常會使用in關鍵字過濾出數(shù)據(jù)。比如:想通過指定的一些id,批量查詢出用戶信息。

select  id,name  from  category      where  id  in  (1,2,3...100000000);

如果我們不做任何限制,該查詢語句一次性可能會查詢出非常多的數(shù)據(jù),很容易導致接口超時。

如果ids超過500條記錄,可以分批用多線程去查詢數(shù)據(jù)。每批只查500條記錄,最后把查詢到的數(shù)據(jù)匯總到一起返回。

4.高效的分頁

  •   有時為了避免一次性返回過多的數(shù)據(jù)影響接口性能,我們一般會對查詢接口做分頁處理。

在mysql中分頁一般用的limit關鍵字:

select  id,name,age  from  user  limit  10,20;
  •   但是當數(shù)據(jù)多的時候,例如

select  id,name,age  from  user  limit  1000000,20;

mysql會查到1000020條數(shù)據(jù),然后丟棄前面的1000000條,只查后面的20條數(shù)據(jù),這個是非常浪費資源的。

解決方案:先找到上次分頁最大的id,然后利用id上的索引查詢。不過該方案,要求id是連續(xù)的,并且有序的。

select  id,name,age  from  user  where  id  >  1000000  limit  20;

5.連接代替子查詢

mysql中如果需要從兩張以上的表中查詢出數(shù)據(jù)的話,一般有兩種實現(xiàn)方式:子查詢  和  連接查詢

  •   子查詢的例子如下:

select  *  from  order  where  user_id  in  (select  id  from  user  where  status=1)

子查詢語句可以通過in關鍵字實現(xiàn),一個查詢語句的條件落在另一個select語句的查詢結果中。程序先運行在嵌套在最內(nèi)層的語句,再運行外層的語句。

子查詢語句的優(yōu)點是簡單,結構化,如果涉及的表數(shù)量不多的話。

但缺點是mysql執(zhí)行子查詢時,需要創(chuàng)建臨時表,查詢完畢后,需要再刪除這些臨時表,有一些額外的性能消耗。

  •   這時可以改成連接查詢。具體例子如下:

select  o.*  from  order  o  inner  join  user  u  on  o.user_id  =  u.id  where  u.status=1

6.控制join表的數(shù)量

  •   根據(jù)阿里巴巴開發(fā)者手冊的規(guī)定,join表的數(shù)量不應該超過3個。如果join太多,mysql在選擇索引的時候會非常復雜,很容易選錯索引。

  •   并且如果沒有命中中,nested loop join 就是分別從兩個表讀一行數(shù)據(jù)進行兩兩對比,復雜度是 n^2。所以我們應該盡量控制join表的數(shù)量。

  •   如果實現(xiàn)業(yè)務場景中需要查詢出另外幾張表中的數(shù)據(jù),可以在a、b、c表中冗余專門的字段,比如:在表a中冗余d_name字段,保存需要查詢出的數(shù)據(jù)。

  •   如果兩張表使用left join關聯(lián),mysql會默認用left join關鍵字左邊的表,去驅(qū)動它右邊的表。如果左邊的表數(shù)據(jù)很多時,就會出現(xiàn)性能問題。

7.控制索引的數(shù)量

  •   眾所周知,索引能夠顯著的提升查詢sql的性能,但索引數(shù)量并非越多越好。因為表中新增數(shù)據(jù)時,需要同時為它創(chuàng)建索引,而索引是需要額外的存儲空間的,而且還會有一定的性能消耗。

  •   阿里巴巴的開發(fā)者手冊中規(guī)定,單表的索引數(shù)量應該盡量控制在5個以內(nèi),并且單個索引中的字段數(shù)不超過5個。

  •  mysql使用的B+樹的結構來保存索引的,在insert、update和delete操作時,需要更新B+樹索引。如果索引過多,會消耗很多額外的性能。

8.提升group by的效率

  •   我們有很多業(yè)務場景需要使用group by關鍵字,它主要功能是去重和分組。

  •   通常它會跟having一起配合使用,表示分組后再根據(jù)一定的條件過濾數(shù)據(jù)。

反例:

select  user_id,user_name  from  order      
group  by  user_id      
having  user_id  <=  200;

這種寫法性能不好,它先把所有的訂單根據(jù)用戶id分組之后,再去過濾用戶id大于等于200的用戶。

正例:

select  user_id,user_name  from  order      
where  user_id  <=  200      
group  by  user_id

使用where條件在分組前,就把多余的數(shù)據(jù)過濾掉了,這樣分組時效率就會更高一些。

其實這是一種思路,不僅限于group by的優(yōu)化。我們的sql語句在做一些耗時的操作之前,應盡可能縮小數(shù)據(jù)范圍,這樣能提升sql整體的性能。

9.索引優(yōu)化

  •  sql優(yōu)化當中,有一個非常重要的內(nèi)容就是:索引優(yōu)化。很多時候sql語句,走了索引,和沒有走索引,執(zhí)行效率差別很大。

  •   索引優(yōu)化的第一步是:檢查sql語句有沒有走索引??梢允褂?code style="padding: 3px 5px; line-height: 1.75; font-size: 14.4px; color: rgb(221, 17, 68); background: rgba(27, 31, 35, 0.05); border-radius: 4px;">explain命令,查看mysql的執(zhí)行計劃。進而查看索引是否生效

  •   sql語句沒有走索引,排除沒有建索引之外,最大的可能性就是索引失效。


該文章在 2024/9/10 10:13:09 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved