2012-08-16 3 views
0

인덱스가있을 때 기본 쿼리가 school_id에 대한 인덱스를 사용하고 있지 않음을 알 수 있습니다. 하위 쿼리를 제거하고 하드 코드 된 목록을 사용하면 색인이 사용됩니다. 그것은 많은 항목이 실제로 목록에있을 것입니다 방법을 알아낼 수 없습니다 때문에 서버는 아마 색인 건너 뛰는IN 하위 쿼리를 사용할 때 쿼리에서 인덱스를 사용하지 않습니다.

mysql> explain SELECT year, race, CONCAT(percent,'%') as percent 
    -> FROM school_data_race_ethnicity as school_data_race_ethnicity_outer 
    -> WHERE school_id IN(
    -> SELECT field_school_id_value 
    -> FROM field_data_field_school_id 
    -> WHERE entity_id IN (SELECT entity_id 
    -> FROM field_data_field_district 
    -> WHERE field_district_nid = 
    -> (SELECT entity_id FROM field_data_field_district_id 
    -> WHERE `field_district_id_value` = 26130106 LIMIT 1)) 
    ->) ORDER BY year DESC, race; 
+----+--------------------+----------------------------------+----------------+------------------------------+-----------+---------+------+-------+-----------------------------+ 
| id | select_type  | table       | type   | possible_keys    | key  | key_len | ref | rows | Extra      | 
+----+--------------------+----------------------------------+----------------+------------------------------+-----------+---------+------+-------+-----------------------------+ 
| 1 | PRIMARY   | school_data_race_ethnicity_outer | ALL   | NULL       | NULL  | NULL | NULL | 97116 | Using where; Using filesort | 
| 2 | DEPENDENT SUBQUERY | field_data_field_school_id  | ALL   | NULL       | NULL  | NULL | NULL | 5325 | Using where     | 
| 3 | DEPENDENT SUBQUERY | field_data_field_district  | index_subquery | entity_id,field_district_nid | entity_id | 4  | func |  1 | Using where     | 
| 4 | SUBQUERY   | field_data_field_district_id  | ALL   | NULL       | NULL  | NULL | NULL | 685 | Using where     | 
+----+--------------------+----------------------------------+----------------+------------------------------+-----------+---------+------+-------+-----------------------------+ 
4 rows in set (0.00 sec) 

mysql> describe school_data_race_ethnicity 
    -> ; 
+-----------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+--------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| school_id | varchar(255) | NO | MUL | NULL |    | 
| year  | int(11)  | NO | MUL | NULL |    | 
| race  | varchar(255) | NO |  | NULL |    | 
| percent | decimal(5,2) | NO |  | NULL |    | 
+-----------+--------------+------+-----+---------+----------------+ 
5 rows in set (0.00 sec) 

mysql> 

답변

2

사용 INNER JOIN 대신 하위 쿼리를 IN 절 :

explain SELECT year, race, CONCAT(percent,'%') as percent 
FROM school_data_race_ethnicity a 
    INNER JOIN(
    SELECT field_school_id_value 
    FROM field_data_field_school_id b 
     INNER JOIN (SELECT entity_id 
        FROM field_data_field_district 
        WHERE field_district_nid = 
        (SELECT entity_id FROM field_data_field_district_id 
        WHERE `field_district_id_value` = 26130106 LIMIT 1)) c 
     ON b. entity_id = c.entity_id 
    ) d 
    ON a.school_id = d.field_school_id_value 
ORDER BY year DESC, race; 
0

을 추구합니다. 하위 쿼리의 항목 수를 예측할 수 없기 때문에 가장 보수적 인 방법을 선택하고 검색을 수행 할 것입니다 (아마도). 내가 사용하여 쿼리를 다시 작성 좋을 것

대신 조인

SELECT DISTINCT o.year, o.race, CONCAT(o.percent,'%') as percent 
FROM school_data_race_ethnicity as o 
INNER JOIN field_data_field_school_id s 
    ON s.field_school_id_value = o.school_id 
INNER JOIN field_data_field_district d 
    ON d.entity_id = s.entity_id 
WHERE field_district_nid = (
    SELECT entity_id 
    FROM field_data_field_district_id 
    WHERE `field_district_id_value` = 26130106 LIMIT 1)) 
ORDER BY o.year DESC, o.race; 
관련 문제