阅读这篇 wiki 文章,我发现如果在 MySQL 数据库中使用带有索引列的 IN() 子句,则 SELECT 性能会被杀死。我的问题是,我怎样才能重写我的查询,以便它不会使用任何 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 列是主键(该表在生成后只是只读的,所以不用担心索引所有内容)。[10 values]
IN() 子句中的 以逗号分隔,例如:IN(1, 2, ..., 10)
.
基本上,我自己加入表路由表并将结果分组以获得所需的记录。其他联接用于检索关联数据。
性能方面,使用 InnoDB 存储引擎,我在 > 30 秒内执行了类似的查询。使用 MyISAM,我得到 >5 秒。但我相信可以更快地获取结果。我的表中有大约 450 万条记录。