今天我面临一个奇怪的问题,我有以下疑问。当我运行这个查询时,需要很长时间。e、 如果我只写“where” w2.cdate介于“2018-01-01 00:00:00”和“2018-10-31 23:59:59”之间,或者仅为“s2.status='new'”,则会立即给出结果,但如果将这两个条件放在一起,则需要时间。我的“cdate”和“status”列都被编入索引。这背后有什么原因?我怎么能找到呢。
select w2.id from status s2
inner join order w2 on s2.warenkorb__id=w2.id
where w2.cdate between '2018-01-01 00:00:00' and '2018-10-31 23:59:59' and s2.status='NEW'
所有条件下的打印结果
用日期条件解释结果
3条答案
按热度按时间sauutmhj1#
您的数据模型允许每个订单有多个状态。因此,为了直接得到查询,我将从order表中选择id并在
WHERE
条款:(在其他dbms中,可以使用
INTERSECT
但是mysql没有这个特性。)现在考虑两种方法:
dbms首先选择状态以获取订单。
dbms首先选择订单并查找其状态。
对于案例1,您需要:
以及您应该已经拥有的order(id)索引。甚至提供一个覆盖索引:
对于案例2,您需要:
创建这四个索引,查看执行计划并删除dbms不使用的索引。
of1yzvn42#
正如你可以看到的不同
EXPLAIN
陈述结果,说明本案使用的所有条件都不能成立Using Index
.您可以添加以下两个复合索引并进行测试:
(warenkorb__id, status)
上status
table。(id, cdate)
上order
table。ALTER TABLE
查询如下:uz75evzq3#
无论优化器决定从哪个表开始,这些都应该很好地工作:
列的指定顺序很重要(我不认为托尔斯滕额外的一对索引有任何帮助。)
关于模式的问题:
是
id
这个PRIMARY KEY
的w2
? (请提供SHOW CREATE TABLE
所以不需要这个问题和其他问题。)这两张table的比例是1:1吗?那通常不是一个好的设计。看来
status
可能在里面w2
.