この 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 列は主キーです (テーブルは一度生成されると読み取り専用なので、すべてにインデックスを付ける心配はありません)。IN() 句の[10 values]
は、次のようにカンマで区切られていますIN(1, 2, ..., 10)
。
基本的に、自分でテーブル ルート テーブルに参加し、結果をグループ化して目的のレコードを取得します。他の結合は、関連データを取得するために使用されます。
パフォーマンスに関しては、InnoDB ストレージ エンジンを使用して、同様のクエリを 30 秒以上で実行しました。MyISAM を使用すると、5 秒以上かかります。しかし、結果はさらに速く取得できると思います。テーブルには最大 450 万件のレコードがあります。