iT邦幫忙

1

查詢報表的聯合索引建立方式

  • 分享至 

  • xImage

各位好 小弟有個問題想請教
目前有一個月份為主的各商品業績報表
當中主要以4個項目做分類
分別是

  1. idept_no (商品分類)
  2. buyer_no (商品負責人)
  3. brand_no (品牌)
  4. 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)
https://ithelp.ithome.com.tw/upload/images/20211216/20123565n6rNnDYKOK.jpg

順便提供一下公司 mysql版本:5.0.95(不知道有沒有影響)

看更多先前的討論...收起先前的討論...
firecold iT邦新手 1 級 ‧ 2021-12-15 11:26:39 檢舉
我感覺你index開單獨的就好
不用開複合
石頭 iT邦高手 1 級 ‧ 2021-12-15 18:13:35 檢舉
能否提供你的 table schema & 查詢執行計畫?
nick iT邦新手 5 級 ‧ 2021-12-16 12:08:26 檢舉
我覺得還是要 EXPLAIN 你的 Query 才知道問題出在哪裏
st474ddr iT邦新手 2 級 ‧ 2021-12-16 13:17:27 檢舉
感謝各位大大的回覆
不好意思我晚回了
@firecold 大大
我是想說在沒有附加條件的話通常筆數應該會比較多
所以套上複合索引應該能比較加速
不知您的看法是?

@石頭大大 @nick大大
我補在文章最下面
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答