Tôi có cơ sở dữ liệu MySQL trong đó bảng A có mối quan hệ một-nhiều với bảng B và tôi muốn chọn tất cả các hàng trong bảng B không có con trong bảng A. tôi đã cố gắng sử dụngChọn hàng cha mẹ chỉ khi nó không có con
SELECT id FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE B.id=A.id)
và
SELECT id FROM A LEFT JOIN B ON A.id=B.id WHERE B.id IS NULL
Cả hai dường như chậm. Có truy vấn nhanh hơn để đạt được điều tương tự không?
Trong trường hợp điều này có liên quan, trong bảng cơ sở dữ liệu của tôi A có khoảng 500.000 hàng và bảng B có khoảng 3 đến 4 triệu hàng.
Edit: Đối với các bảng cơ sở dữ liệu thực tế trong tôi, giải thích cho tôi:
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
| 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 |
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
cho
select number from frontend_form471 where not exists (select * from SchoolData where SchoolData.`f471 Application Number`=frontend_form471.number)
và
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
| 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 |
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
cho
select distinct number from frontend_form471 left join SchoolData on frontend_form471.number=SchoolData.`f471 Application Number` where SchoolData.`f471 Application Number` is NULL
nơi trong trường hợp frontend_form471 của tôi là bảng A và SchoolData là bảng B
Edit2: Trong bảng B (SchoolData) trong cơ sở dữ liệu của tôi, id là phần đầu tiên của một khóa chính hai phần, vì vậy nó là được lập chỉ mục và vẫn còn nhiều mục nhập trong B có cùng id.
'TÙY CHỌN CHỌN id TỪ LẠI THAM GIA B ON A.id = B.id Ở đâu B.id LÀ NULL' bạn có thể đăng kết quả giải thích cho cả hai truy vấn? – Igor
Các chỉ mục có giúp ích gì không? – Londeren
Đang chọn nếu 'COUNT (*) = 0' nhanh hơn? –