【问题标题】:How to improve select range of values if one one of them have specific variable in Mysql如果其中一个值在 Mysql 中有特定变量,如何改进选择范围
【发布时间】:2019-04-22 15:28:56
【问题描述】:

我的问题是如何加快速度。应该有更优雅的方式来处理它。 内部选择在 0,038 秒内完成,但这个在 6,007 秒内完成,我不知道如何提高这个性能

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

问题是我需要同一个表中的值范围,如果一个值包含在 value2 变量 1 中

所以从这样的表中

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

【问题讨论】:

  • 你想要什么结果?
  • 提高性能。应该有办法做到这一点。

标签: mysql sql performance select


【解决方案1】:

您可以将其转换为Correlated Subquery with 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 *。您可以阅读:Why is SELECT * considered harmful?

【讨论】:

  • 性能没有任何提升,它可以工作,但停机时间仍然超过 6 秒。
  • @arudiel 您是否在列上定义了索引?添加我的答案中指定的复合索引。
  • 起初我认为它有帮助,但经过测试,存在与标准按值选择相同的问题。在@Madhur Bhaiya 建议的解决方案中,添加 id 列仅显示满足语句值的 ID,而不是整行。
  • @arudiel 检查我的解决方案;我从来没有使用过ID。我不知道你为什么匹配ID。它会杀死所有的目的
  • @arudiel 添加我在回答中提到的索引(alter table 声明)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2014-02-12
  • 2021-12-14
  • 2012-09-19
相关资源
最近更新 更多