考慮以下兩個查詢:添加WHERE子句使查詢很慢
select a.*, c.*
from account a
join customer c on a.customer_id = c.id
join import i on a.import_id = i.id
join import_bundle ib on i.import_bundle_id = ib.id
和
select a.*, c.*
from account a
join customer c on a.customer_id = c.id
join import i on a.import_id = i.id
join import_bundle ib on i.import_bundle_id = ib.id
where ib.id = 8
第一個查詢速度快,第二個是超級慢。任何想法爲什麼?我猜我需要一個索引或其他東西,但我不明白索引的工作原理。我正在使用MySQL。
這裏的,如果我在第二查詢做一個EXPLAIN
會發生什麼:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ib const PRIMARY PRIMARY 8 const 1 Using index
1 SIMPLE c ALL PRIMARY 144858
1 SIMPLE a ref fk_account_customer_id,fk_account_import_id fk_account_customer_id 8 mcif.c.id 2
1 SIMPLE i eq_ref PRIMARY,import_bundle_id PRIMARY 8 mcif.a.import_id 1 Using where
我不知道如何解釋,雖然。
編輯:這是我最後使用:
select a.*,
c.*
from account a
join customer c on a.customer_id = c.id
join (select id,
import_bundle_id
from import
where import_bundle_id = 8) i on a.import_id = i.id
join import_bundle ib on i.import_bundle_id = ib.id
上import_bundle.id
添加索引什麼也沒做。
查詢計劃看起來像什麼?索引涵蓋ib.id? – 2010-11-19 19:46:08
你是什麼意思,「查詢計劃看起來像什麼?」 – 2010-11-19 20:14:10
有時,事情並不像他們看起來那樣。你如何比較這兩個查詢?你看過檢索_first_記錄的時間還是_last_記錄。後者是應該測量的東西,但如果您是從SQL客戶端應用程序開始工作,則只需查看前者即可。 – Axn 2010-11-19 20:20:39