InnoDB で MySQL 5.5 を使用します。次のようなクエリがあります
SELECT
count(distinct a.thing_id) as new_thing_count,
sum(b.price) as new_thing_spend
FROM thing ii
LEFT OUTER JOIN thing a
ON a.customer_id = ii.customer_id
AND a.created_at >= '2013-01-01'
AND a.created_at <= '2013-03-31'
JOIN whatsit b
ON b.whatsit_id = a.original_whatsit_id
WHERE ii.customer_id = 3
どこ
thing
カーディナリティは約 25k で、そのうち 3.5k は顧客 3 に属します- 可能な は 12 個あり
customer_id
ます
でインデックスを使用してこのクエリを実行すると、customer_id
約 10 秒かかります。インデックスを削除すると、0.03 秒かかります。
これがなぜなのかわかりません。インデックスなしで説明した結果は次のとおりです。
1 SIMPLE ii ALL 24937 Using where
1 SIMPLE a ALL 24937 Using where; Using join buffer
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 db.a.original_whatsit_id 1
ここにインデックスがあります(thing_customer
)
1 SIMPLE ii ref thing_customer thing_customer 4 const 3409 Using index
1 SIMPLE a ref thing_customer thing_customer 4 const 3409 Using where
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 db.a.original_whatsit_id 1
論理的にはそうすべきではないように思われるのに、なぜこのインデックスが物事を非常に遅くしているのかを誰かが解釈するのを手伝ってくれますか?