我使用這個查詢來獲取所有員工{客戶名稱以小寫的「a」}:MySQL的 - 如何使用索引,其中X IN(<subquery>)
SELECT * FROM employees
WHERE client_id IN (SELECT id FROM clients WHERE name LIKE 'a%')
列employees.client_id
是int,與INDEX client_id (index_id)
。子查詢應該IMHO返回一個id-s列表,然後在WHERE子句中使用它。
當我EXPLAIN
查詢,主查詢使用沒有索引(type:ALL
)。但是,當我EXPLAIN
從子查詢(例如SELECT ... WHERE client_id IN (121,184,501)
),則EXPLAIN
切換到type:range
截取的列表,並且該查詢由50%變快。
我怎樣才能使查詢使用子查詢返回的數據指標 - 或者是有這個檢索數據的更有效的方法? (檢索id-list到應用程序服務器,加入它併發送第二個查詢在這裏更加昂貴)。
在此先感謝。
也可以使用INNER JOIN語法。 – MarkR 2008-12-04 10:07:41
我見過查詢優化器真的錯了,並且返回ID的子查詢加載速度更快。但這是一個非常具體的案例。 請參閱:http://www.benlumley.co.uk/2008/06/25/mysql-query-optimiser-left-lacking/,如果你有興趣的細節。 – benlumley 2008-12-04 10:15:59