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万レコードあります。
クエリを少しフォーマットするのに気をつけますか? –
私の質問を編集しました、申し訳ありません。 – linkyndy
IN(1,3,47、... 89)または 'IN(SELECT column FROM table) 'という10個の値はありますか? –