【发布时间】:2018-07-30 16:53:20
【问题描述】:
我正在使用 mysql 5.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 ;
问题
- 以上查询扫描 8 行(而根据 where 条件,它应该只扫描 4 行)
预期结果:
它应该只扫描 4 行而不是 8 行。
有人能解释一下为什么mysql扫描8行而不是4行吗?
谢谢
【问题讨论】:
-
你的问题是死锁。但是您问为什么它扫描 8 并返回 4。为什么您认为它应该扫描返回的行数?它说
type = ALL。这意味着它会查看所有行。它不使用索引,因为对这么小的表使用索引会比较慢。表中有 8 行,因此它会查看所有行,确定由于WHERE而需要 4 行并返回这 4 行。 -
@N.B.表格共有 16 行。我已经在唯一键中使用的 where 子句中指定了所有条件。但它仍然扫描 8 行,而不是 4 或 16 行。
-
大家好,提到有问题的死锁会造成很多混乱,我已经删除了那部分。
-
我的评论仍然有效。没有规则说 MySQL 将扫描 X 行并返回 X 行。
-
@N.B.我并不是说你错了,但我要问的是,由于上述查询,如果我在两个不同的会话中使用相同的条件运行删除查询,那么在相同数据的事务锁定中删除查询。您可以查看 information_Schema.INNODB_LOCKS 表来验证 lock_data。
标签: mysql