各位好 小弟有個問題想請教
目前有一個月份為主的各商品業績報表
當中主要以4個項目做分類
分別是
idept_no
(商品分類)buyer_no
(商品負責人)brand_no
(品牌)vendor_no
(廠商)只會有一個項目顯示,其餘皆是附加條件
例: 我可以查 202101 到 202112 的所有廠商是'123',品牌是'456',負責人是'91254'的所有商品分類
sql 會是這樣下的 (我是用php組成mysql語句)
// $search_type:代表主要搜尋項目,在此範例是商品分類也就是 idept_no
// $time_start $time_end:就是日期範圍,在此為202101, 202112
// $option_sql:為附加條件,可有可無,在此為 vendor_no = '123', brand_no = '456', buyer_no = '91254'
select $search_type, round(sum(depositqty)) as depositqty, round(sum(depositamtx)) as depositamtx, sum(qty) as qty, round(sum(amtx)) as amtx, round(sum(amtx-cost)) as profit
from report
where yyyymm between '$time_start' and '$time_end' $option_sql
group by $search_type
order by $search_type
而日期條件是一定要下的,欄位名稱 acct_date
(型式:YYYYMM,例:202112)
我打算建聯合索引來幫助查尋更快 (目前16w筆,但查詢時間要0.5秒左右)
目前的primary_key是 acct_date+sku_no
而秉持著最左匹配原則,我建了4個聯合索引就是 yyyymm+idept_no
, yyyymm+buyer_no
, yyyymm+brand_no
, yyyymm+vendor_no
但這方法應該是不對的
首先,index 吃不到(我想會不會是我開太多太像的聯合索引,mysql不知道要選擇哪個)
其次,這在有附加條件的狀況下基本就全表搜尋
想請教各位大大,在這種欄位不一定的query要怎麼下index呢?
<更新>
以下是實際的query(同樣以上述為例)
select idept_no, round(sum(depositqty)) as depositqty, round(sum(depositamtx)) as depositamtx, sum(qty) as qty,
round(sum(amtx)) as amtx, round(sum(amtx-cost)) as profit
from report m
where m.yyyymm between '202101' and '202112' and m.vendor_no = '123', m.brand_no = '456', m.buyer_no = '91254'
group by idept_no
order by idept_no
接著是explain結果(imarkno就是brand_no, venno就是 vendor_no)
順便提供一下公司 mysql版本:5.0.95(不知道有沒有影響)