sql—如果其中一个值在mysql中有特定的变量,如何改进选择值的范围

5hcedyr0  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(282)

我的问题是怎样才能加快速度。应该有更优雅的处理方法。内部选择是在0038秒完成,但这一个是在6007秒完成我不知道如何才能提高这个性能

select * FROM table
where number1 in (
SELECT number1 
FROM table
WHERE `date` = 'yyyy-mm-dd' 
AND value1 = 'variable1' 
AND value2 = 1
)

问题是,如果value2中包含变量1,我需要来自同一个表的值的范围
所以从那张table开始

id|number1| value1   | value2
1 | 11403 | exempl1  |  null
2 | 11404 | exempl1  | 1
3 | 11404 | exempl1  | null
4 | 11405 | exempl1  | null
5 | 11405 | exempl1  | null

我只得到这个

id|number1| value1   | value2
2 | 11404 | exempl1  | 1
3 | 11404 | exempl1  | null
dwthyt8l

dwthyt8l1#

可以将其转换为与exists相关的子查询。在这种情况下,mysql优化器可能能够使用索引(如果定义的话)。

SELECT t1.* 
FROM table AS t1
WHERE EXISTS( SELECT 1 
              FROM table AS t2
              WHERE t2.number1 = t1.number1 AND 
                    t2.`date` = 'yyyy-mm-dd' AND 
                    t2.value1 = 'variable1' AND 
                    t2.value2 = 1 )

如果未定义索引,则可以在上定义复合索引 (number1, date, value1, value2) ,以获得更好的性能。

ALTER TABLE `table`
ADD INDEX comp_idx1(number1, `date`, value1, value2);

另一种优化方法是只获取应用程序代码中真正需要的列。避免使用 SELECT * . 你可能会读到:为什么select*被认为是有害的?

相关问题