난 그냥 느린 로그 (+ 인덱스를 사용하지 않는)를 사용할 수 내가 (만 user
변경)MySQL을 사용하지 않는 인덱스
SELECT id
, name
FROM `all`
WHERE id NOT IN(SELECT id
FROM `picks`
WHERE user=999)
ORDER BY name ASC;
는 EXPLAIN 쿼리의 같은 종류에 대한 항목의 수백을 얻고 있습니다 :
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
| 1 | PRIMARY | all | index | NULL | name | 156 | NULL | 209 | Using where; Using index; Using filesort |
| 2 | DEPENDENT SUBQUERY | picks | ref | user,user_2,pick | user_2 | 8 | const,func | 1 | Using where; Using index |
+----+--------------------+-------------------+-------+------------------+--------+---------+------------+------+------------------------------------------+
이 쿼리를 최적화하는 방법에 대한 아이디어가 있으십니까? 여러 필드를 가지고 있지만 다른 인덱스는 사용하지 않았습니다.
999를 제외하고 모든 사용자에게 속한 모든 선택 항목이 표시됩니다. 맞습니까? 쿼리가 수행하는 작업 (효율적인 방법은 아님)은 '사용 가능한'선택 목록을 가져 오는 중이지만 사용자가 이미 선택한 항목은 제거하는 것입니다. –
이 쿼리는 'picks'에 일치하는 항목이없는 행에 대해서는 아무것도 반환하지 않고 원래 쿼리는 반환하지 않습니다. –
간단한 수정으로 외부에서 조인하면됩니다. – northpole