mysql 優化 子查詢和left join(一)

2021-07-04 15:42:47 字數 2041 閱讀 3295

今天針對乙個mysql做優化

具體如下設計到幾張表

商品表: goods

會員消費表:member_consumes

會員表: members

會員標籤表member_label

分組標籤表: group_label

大體功能是這樣的在分組營銷的分組資料下面檢視會員消費前十的商品是哪些

比如:在孕婦裝分組下面會員買的最多的是那些牌子的商品

之前的sql語句是這樣的

select g.name name ,count( c.goods_id) num from member_consumes c left join join goods g on lpad(c.goods_id,8,』0』)=g.code where c.member_no in

(select no from members where id in

( select distinct member_id from member_label where label_id in

(select label_id from group_label where group_id=33)

) )

group by c.goods_id order by num desc limit 10;

查詢時間是163s

而且沒有加索引,一開始我以為是索引問題,後來加上還是163s。檢視資料庫發現是member_consumes 和goods 的資料大概每張表是1w條。1w*1w大概是1億條記錄。發現原因 了,因為我們只要前10條所以可以先得到賣的最多的前十條在left jion查詢

改進sql:

select g.name name,num from (

select c.goods_id ,count( c.goods_id) num from member_consumes c where c.member_no in

(select no from

( select no from members where id in

( select distinct member_id from member_label where label_id in

(select label_id from group_label where group_id=33)

) )memberno

) group by c.goods_id order by num desc limit 10

)memberinfo

left join goods g on lpad(memberinfo.goods_id,8,』0』)=g.code

這時發現sql裡面不僅僅有子查詢還有left jion查詢,這個查詢時間大概0.054s。感覺怪怪的。。。。。就是**不美觀。其實還有其他原因比如:left join 更規範,left jion資料庫引擎能更好自動優化

又一次改進:

select g.name name ,count( c.goods_id) num from goods g

left join member_consumes c on lpad(c.goods_id,8,』0』)=g.code

left join members m on c.member_no=m.no

left join member_label l on m.no=l.member_id

left join group_label gl on l.label_id=gl.label_id

where gl.group_id=33

group by c.goods_id order by num desc limit 10;

優美又高效的sql爐了查詢時間大概0.002s

總結:小表驅動大表,left jion查詢

mysql版本優化子查詢 MySQL優化子查詢

我想優化這個查詢 因為子查詢一般來說速度不快 但是我輸了,因為我無法使用連線來重寫它,這對於效能更好,你能幫助mi嗎?select id,company,street,number,number addition,postalcode,telephone from clients where pos...

mysql優化子查詢 join

使用連線 join 來代替子查詢 sub queries mysql從4.1開始支援sql的子查詢。這個技術可以使用select語句來建立乙個單列的查詢結果,然後把這個結果作為過濾條件用在另乙個查詢中。例如,我們要將客戶基本資訊表中沒有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售資訊表中將所有發出...

mysql利用join優化子查詢

有表user id,name 和code id,student code 如果要查詢code在user中的對應的全部內容 沒有就為null 方式1 子查詢 select a.id a,name select b.student code from code c where c.id u.id fro...