MySQL 索引 - In 与 Equals 索引问题

标签 mysql sql innodb

以下查询在 mysql 服务器上运行得非常快且即时:

SELECT  table_name.id 
FROM table_name 
WHERE table_name.id in (10000)

SELECT table_name.id 
from table_name 
where table_name.id = (SELECT table_name.id 
                       FROM table_name 
                       WHERE table_name.id in (10000)
                      );

但是如果我将第二个查询更改为如下,则需要超过 20 秒:

SELECT table_name.id 
from table_name 
where table_name.id in (SELECT table_name.id 
                        FROM table_name 
                        WHERE table_name.id in (10000)
                        );

在进行解释时,我得到以下输出。很明显,MySQL 在如何索引数据以及使用 in 关键字方面存在一些问题。

对于第一个查询:

+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table         | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | table_name    | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+

对于第二个查询:

+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table         | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | PRIMARY     | table_name    | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index |
|  2 | SUBQUERY    | table_name    | const | PRIMARY       | PRIMARY | 4       |       |    1 | Using index |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+

对于第三个查询:

+----+--------------------+------------+-------+---------------+---------+---------+-------+---------+--------------------------+
| id | select_type        | table_name | type  | possible_keys | key     | key_len | ref   | rows    | Extra                    |
+----+--------------------+------------+-------+---------------+---------+---------+-------+---------+--------------------------+
|  1 | PRIMARY            | table_name | index | NULL          | sentTo  | 5       | NULL  | 6250751 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | table_name | const | PRIMARY       | PRIMARY | 4       | const |       1 | Using index              |
+----+--------------------+------------+-------+---------------+---------+---------+-------+---------+--------------------------+

我正在使用 InnoDB,并尝试更改第三个查询以强制使用索引,如以下类别所示。

最佳答案

在第一种情况下,您只有子查询中的第一条记录(它运行一次,因为 equals 仅适用于第一个值)

在第二个查询中,您得到了笛卡尔乘法(每个),因为 IN 为每一行运行子查询。这对性能不利

尝试在这些情况下使用联接。

关于MySQL 索引 - In 与 Equals 索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22149596/

相关文章:

mysql - 全文 InnoDB 搜索没有响应

mysql - 为什么存在唯一索引时MySQL Innodb "Creating sort index"?

mysql - 如何查询: agregate group by column A for each column B value

mysql - 关于私有(private) MySQL 实例和 WordPress 的问题

mysql - MySQL WHERE 中一个字段的多个条件

mysql - 如何处理大型数据库?

php - 将多个php代码条件转换为SQL命令

php - 优化查询(2个坐标之间的距离)

php - 如何对 MYSQL 进行多次插入,每次插入都基于子查询中一组值中的每个值?

sql - 如何插入名称为sql关键字的列