mysql - 使用 IN 子查询时查询不使用索引

标签 mysql

您会注意到,当有索引时,主查询没有使用 school_id 上的索引。如果我删除子查询并使用硬编码列表,它将使用索引。

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> 

最佳答案

使用 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;

关于mysql - 使用 IN 子查询时查询不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987564/

相关文章:

php - 在php中将字符串转换为浮点型

php - 选择用户详细信息时的 MySQL 更新事件

php - 在 laravel 4 上验证上传图片

php - 使用 codeigniter 将字符串日期时间插入到 mysql 数据库中

php - 将 Sakila 数据库导入 PhpMyAdmin

php - 同一个表中的两个递增列

MYSQL 连接返回三重结果

php - Codeigniter 未显示 MySQL 查询获取的数组的正确结果。

C# - Kerosene ORM - 找不到默认引擎和连接字符串

javascript - 如何使用 PHP 偏移 HTML 表格以从不同列的第二行单元格值中减去第一行的单元格值