mysql - 当涉及的所有列都相同且仅 where 条件发生变化时,为什么查询执行速度如此之慢?

标签 mysql select

我有这个查询:

SELECT 1 AS InputIndex,
       IF(TRIM(DeviceInput1Name = '', 0, IF(INSTR(DeviceInput1Name, '|') > 0, 2, 1)) AS InputType,
       (SELECT Value1_1 FROM devicevalues WHERE DeviceID = devices.DeviceID ORDER BY ValueTime DESC LIMIT 1) AS InputValueLeft,
       (SELECT Value1_2 FROM devicevalues WHERE DeviceID = devices.DeviceID ORDER BY ValueTime DESC LIMIT 1) AS InputValueRight
  FROM devices
 WHERE DeviceIMEI = 'Some_Search_Value';

此过程相当快地完成(最多 0.01 秒)。但是,使用 WHERE 子句运行相同的查询

 WHERE DeviceIMEI = 'Some_Other_Search_Value';

使其运行时间长达 14 秒!有些搜索值很快就会完成,而另一些则运行时间太长。

如果我在任一查询上运行 EXPLAIN,我会得到以下结果:

+----+--------------------+--------------+-------+---------------+------------+---------+-------+------+-------------+
| id | select_type        | table        | type  | possible_keys | key        | key_len | ref   | rows | Extra       |
+----+--------------------+--------------+-------+---------------+------------+---------+-------+------+-------------+
|  1 | PRIMARY            | devices      | ref   | DeviceIMEI    | DeviceIMEI | 28      | const |    1 | Using where |
|  3 | DEPENDENT SUBQUERY | devicevalues | index | DeviceID,More | ValueTime  | 9       | NULL  |    1 | Using where |
|  2 | DEPENDENT SUBQUERY | devicevalues | index | DeviceID,More | ValueTime  | 9       | NULL  |    1 | Using where |
+----+--------------------+--------------+-------+---------------+------------+---------+-------+------+-------------+

此外,这是实际的记录数,以便一目了然:

mysql> select count(*) from devicevalues inner join devices using(DeviceID) where devices.DeviceIMEI = 'Some_Search_Value';
+----------+
| count(*) |
+----------+
|  1017946 |
+----------+
1 row in set (0.17 sec)

mysql> select count(*) from devicevalues inner join devices using(DeviceID) where devices.DeviceIMEI = 'Some_Other_Search_Value';
+----------+
| count(*) |
+----------+
|   306100 |
+----------+
1 row in set (0.04 sec)

有什么想法为什么更改 WHERE 子句中的搜索值会导致查询执行如此缓慢,即使要搜索的物理记录数量较少?

请注意,您无需重写查询,只需解释为什么会发生上述情况即可。

更新:我尝试运行两个单独的查询,而不是一个具有依赖子查询的查询来获取我需要的信息(首先,我从 devices 中选择 DeviceID code> 按 DeviceIMEI,然后从 devicevaluesDeviceID(我从上一个查询中获得)进行选择),所有查询都会立即返回。我想唯一的解决方案是在事务中运行这些查询,因此我将创建一个存储过程来执行此操作。然而,这仍然没有回答我困惑的问题。

最佳答案

我不认为 1017946 相当于您的第一个查询返回的行数。您的第一个查询返回来自具有某些相关查询的设备的所有行,您的计数查询返回两个表之间的所有公共(public)行。如果这是所以问题可能是基数问题,即第一个查询中 some_other_values 所占行的比例比 some_value 要大得多,因此 Mysql 选择表扫描。

关于mysql - 当涉及的所有列都相同且仅 where 条件发生变化时,为什么查询执行速度如此之慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875629/

相关文章:

Php, MySql 连接3张表,并计算SUM

php - 搜索逻辑可高效访问 6 个以上相关表

mysql - Rails/MySQL ActiveRecord::RecordNotUnique

ruby-on-rails - 如何使用散列填充选择标记并将值正确保存到数据库?

mysql - 检查上一步状态是否完成并显示下一步是否完成

mysql - 将 MySQL 触发器转换为 SQLite

php - MySQL SQL STATE[HY000] [1203] 用户 XXXXX 已拥有超过 'max_user_connections' 个事件连接

android - 在Webview中长按-应用崩溃

sql-server - SQL Server : case without a null return

mysql - 在一个 SQL 语句中连接多个 select 语句