テーブルAがテーブルBと一対多の関係にあるMySQLデータベースを持っていて、テーブル内に子を持たないすべての行を選択したいA.私は、これらの両方が遅いように見える子供がいない場合のみ親行を選択
SELECT id FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE B.id=A.id)
と
SELECT id FROM A LEFT JOIN B ON A.id=B.id WHERE B.id IS NULL
を使用して試してみました。同じことを達成するためのより高速なクエリがありますか?
この場合、データベーステーブルAには約500,000行あり、テーブルBには約300万〜400万行あります。
編集:私のデータベース内の実際の表の、説明は私に与える:
用select number from frontend_form471 where not exists (select * from SchoolData where SchoolData.`f471 Application Number`=frontend_form471.number)
と
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
| 1 | SIMPLE | frontend_form471 | index | NULL | frontend_form471_61a633e8 | 32 | NULL | 671927 | Using index; Using temporary |
| 1 | SIMPLE | SchoolData | index | PRIMARY | PRIMARY | 49 | NULL | 3121110 | Using where; Using index; Not exists; Distinct |
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
ため
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
| 1 | PRIMARY | frontend_form471 | index | NULL | frontend_form471_61a633e8 | 32 | NULL | 671927 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | SchoolData | index | PRIMARY | PRIMARY | 49 | NULL | 3121110 | Using where; Using index |
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
を
私の場合frontend_form471テーブルAとSchoolDataは
EDIT2テーブルBである場合:私のデータベース内のテーブルB(SchoolData)で、IDが2つの部分、主キーの最初の部分であるので、それは同じidを持つBには複数のエントリがまだ存在します。
'EXPLAIN SELECT id from LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL '両方のクエリに対してEXPLAINの結果を投稿できますか? – Igor
インデックスは役に立ちませんか? – Londeren
'COUNT(*)= 0'より速く選択していますか? –