gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:30:12 25 4
gpt4 key购买 nike

我有这个查询:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com