gpt4 book ai didi

Mysql解释查询扫描更多行然后实际返回什么

转载 作者:行者123 更新时间:2023-11-29 10:07:34 26 4
gpt4 key购买 nike

我使用的是mysql5.6.22-log

我正在表 aggr 上执行查询,所有条件都在 where 子句中。

以下是数据

表格

CREATE TABLE aggr (
a_date DATE,
product_id INT(11),
data_point VARCHAR(16),
los INT(11),
hour_0 DOUBLE(4,2),
UNIQUE KEY `unique_row` (a_date,product_id,data_point,los),
INDEX product_id(product_id)
);

插入查询

INSERT INTO aggr(a_date,product_id,data_point,los,hour_0) 
VALUES
('2018-07-29',1,'arrivals',1,10),('2018-07-29',1,'departure',1,9),
('2018-07-29',1,'solds',1,12),('2018-07-29',1,'revenue',1,45.20),
('2018-07-30',1,'arrivals',2,10),('2018-07-30',1,'departure',2,9),
('2018-07-30',1,'solds',2,12),('2018-07-30',1,'revenue',2,45.20),

('2018-07-29',2,'arrivals',1,10),('2018-07-29',2,'departure',1,9),
('2018-07-29',2,'solds',1,12),('2018-07-29',2,'revenue',1,45.20),
('2018-07-30',2,'arrivals',2,10),('2018-07-30',2,'departure',2,9),
('2018-07-30',2,'solds',2,12),('2018-07-30',2,'revenue',2,45.20);

查询

EXPLAIN 
SELECT * FROM aggr
WHERE a_date BETWEEN '2018-07-29' AND '2018-07-29'
AND product_id = 1
AND data_point IN('arrivals','departure' ,'solds','revenue')
AND los = 1 ;

问题

  1. 以上查询扫描 8 行(而根据 where 条件,它应该只扫描 4 行)

enter image description here

预期结果:

它应该只扫描 4 行而不是 8 行。

有人能解释一下为什么 mysql 扫描 8 行而不是 4 行吗?

谢谢

最佳答案

EXPLAIN 语句用于获取有关查询如何执行的信息。 数字只是一个近似值,查询优化器在构建执行计划时使用它来做出决策。它是数据库管理员或开发人员获取诊断信息的工具。

EXPLAIN 的结果实际上向您显示的是您的查询没有可用的索引(key(NULL)) 。这是非常糟糕的,可能会导致该查询显着减慢。通过查看您的表定义,我想说您需要为 data_point 建立一个单独的索引,或者至少尝试使其成为主键的最后一列。

然而,这些都不足以解释僵局。我什至不知道你为什么在这里向我们展示EXPLAIN - 它与此无关。为了能够诊断死锁,您需要提供更多信息。从表的类型(MyISAMInnoDB 等)和SHOW FULL PROCESSLIST 开始。然后,对于每个进程,查看它为每个表持有哪些锁。

关于Mysql解释查询扫描更多行然后实际返回什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598855/

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