昨日、サーバー上で遅いクエリが実行されているのを見つけました (このクエリは 1 分以上かかります)。次のようになります。
select a.* from a
left join b on a.hotel_id=b.hotel_id and a.hotel_type=b.hotel_type
where b.hotel_id is null
テーブル a には 40000 行以上、テーブル b には 10000 行以上あります。 テーブル b の hotel_id 列と hotel_type 列には UNIQUE KEY idx_hotel_id
( hotel_id
, hotel_type
) のように一意のキーが既に作成されています。このSQLと私は次のような結果を得ました:
type key rows
1 SIMPLE a ALL NULL NULL NULL NULL 36804
1 SIMPLE b index NULL idx_hotel_id 185 NULL 8353 Using where; Using index; Not exists
MySQL のリファレンス マニュアルによると、インデックスのすべての部分が結合によって使用され、インデックスが PRIMARY KEY または UNIQUE NOT NULL インデックスである場合、結合タイプは「eq_ref」になります。クエリ プランの 2 行目を参照してください。列タイプの値は「index」です。しかし、実際には hotel_id と hotel_type に一意のインデックスがあり、2 つの列の両方が結合で使用されていました。結合タイプ「ef_ref」は、結合タイプ「ref」と「ref」よりも効率的です。 " は "range" よりも効率的です。"index" は、"ALL" を除く最後の結合タイプです。これが私が混乱していることであり、ここでの結合タイプが "index" である理由を知りたいです。私の質問を明確に説明したいと思います。皆さんからの回答を楽しみにしています。ありがとう!