讀this wiki article,我發現如果在MySQL數據庫中使用帶索引列的IN()子句,SELECT性能會被終止。我的問題是,如何重寫我的查詢,以便它不會使用任何IN()子句,同時仍然保持其功能?使用IN()子句優化查詢
我的查詢是:
SELECT
`Route`.`route_id`, `Route`.`order`, `Route2`.`order`
FROM
`routes` AS `Route`
INNER JOIN
`routes` AS `Route2`
ON `Route`.`route_id` = `Route2`.`route_id`
WHERE
`Route`.`station_line_id` IN ([10 values]) AND
`Route2`.`station_line_id` IN ([10 values]) AND
`Route`.`order` <= `Route2`.`order`
GROUP BY `
`Route`.`station_line_id`, `Route2`.`station_line_id`, (`Route2`.`order` - `Route`.`order`)
,我已經索引的所有列(ROUTE_ID,station_line_id,station_id和line_id),與id列是主鍵(表只是只讀一旦產生,所以不用擔心索引一切)。 IN()子句中的[10 values]
用逗號分隔,如:IN(1, 2, ..., 10)
。
基本上,我自己加入表路由表並將結果分組以獲得所需的記錄。其他連接用於檢索關聯的數據。
性能方面,使用InnoDB存儲引擎,我在> 30秒內執行類似的查詢。使用MyISAM,我會得到> 5秒。但我相信結果可以更快取得。表中有450萬條記錄。
小心地格式化您的查詢一點點? – 2012-04-13 15:17:46
我編輯了我的問題,對不起。 – linkyndy 2012-04-13 15:20:15
這10個值是:IN(1,3,47,... 89)還是IN(SELECT column from table)? – 2012-04-13 15:25:16