如何优化下面的mysql查询

如何优化下面的mysql查询,mysql,Mysql,我在mysql查询中遇到了问题。查询如下 SELECT * FROM group WHERE (level IN (3,4,5,6) AND last_time BETWEEN 0 AND 3) OR (level IN (4,5,6,7) AND last_time BETWEEN 0 AND 6); 如何优化可以删除或单词的查询。谢谢 此外,查询可以像下面那样进行扩展 SELECT * FROM group WHERE (level IN

我在mysql查询中遇到了问题。查询如下

SELECT *  
FROM group 
WHERE  (level IN (3,4,5,6) AND  last_time BETWEEN  0 AND 3) 
OR     (level IN (4,5,6,7) AND  last_time BETWEEN  0 AND 6);
如何优化可以删除
单词的查询。谢谢

此外,查询可以像下面那样进行扩展

SELECT *  
    FROM group 
    WHERE  (level IN (3,4,5,6) AND  last_time BETWEEN  0 AND 3) 
    OR     (level IN (4,5,6,7) AND  last_time BETWEEN  0 AND 6)
    OR     ... ;

有人能解释一下解决方案的思路吗?非常感谢

查询看起来很好。有时,您希望满足一个或另一个条件。优化器的工作是找到执行查询的最佳方式

您可以尝试帮助优化器,但实际上这并不是必需的,所以只有在您确实存在性能问题时才这样做

您的查询可以写成

SELECT *  
FROM group 
WHERE  (level = 3 AND  last_time BETWEEN  0 AND 3) 
OR     (level IN (4,5,6,7) AND  last_time BETWEEN  0 AND 6);
因为标准重叠,但我怀疑这会对优化器有多大帮助

你也可以这样做:

SELECT *  
FROM group 
WHERE Level in (3,4,5,6,7) 
AND last_time BETWEEN 0 AND 6
AND 
(
  (level IN (3,4,5,6) AND  last_time BETWEEN  0 AND 3) 
OR
  (level IN (4,5,6,7) AND  last_time BETWEEN  0 AND 6)
);
因此,您应该首先列出所有有问题的值(没有任何条件需要
级别
不在3-7中,也没有任何条件需要
上次
在0-6之外)。然后才列出单个条件。这可能对优化器有帮助,也可能没有帮助


无论如何,您应该在
级别上有一个复合索引
+
上次
。使用此索引或执行完整表扫描的速度取决于数据,但您还是应该提供此类索引。

通常最快的解决方案是将其拆分为多个联合查询。然后,每个较小的查询都可以有效地使用索引

SELECT *  
FROM group 
WHERE  (level IN (3,4,5,6) AND  last_time BETWEEN  0 AND 3) 
UNION
SELECT *  
FROM group 
WHERE  (level IN (4,5,6,7) AND  last_time BETWEEN  0 AND 6);

让我们检查MySQL是否足够聪明,可以优化或:

mysql> explain splain select * from seqid in (1,2,3) or id in (4,5,6);
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | seq   | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    6 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
“seq”是一个包含1M整数的表格

好吧,MySQL优化了数据库,或者说还不错。正如您所期望的那样,它使用索引。无需进一步调整查询


我建议您检查查询的解释,以验证MySQL是否正确优化了查询。

您的or子句正在终止您的查询。。。它可以是这样的……从组中选择*(级别在(3,4,5,6,7)中,最后一次时间在0和6之间);或者通过数据来明确您的需求,以获得更多信息info@AnkitAgrawal您的解决方案是错误的,level=3,last_time=5不能满足OP查询,但会将您的
传递到where
conditions@StefanoZanini您是否有其他解决方案,请分享,这样优化查询和学习会很好,因为分享就是关心:-)