SQL查询需要很长时间,是错误还是低效?

时间:2013-06-13 14:07:51

标签: mysql sql performance

我有一个数据库表,我想要选择所有行,其中有一行具有相同的field1field2 = 5。我做了以下SQL查询:

SELECT * FROM `table` 
WHERE `field1` IN (SELECT `field1` FROM `table` WHERE `field2`=5)

当我在phpmyadmin上运行此查询时,我没有收到错误,但运行需要很长时间。很长 - 它在10分钟内没有完成...选择5的子查询只需要0.0058s。该表有大约200万行。

它是否需要这么长时间,因为查询有问题,或者它对这么大的表只是不够高效?如果是后者,我该如何优化查询?


示例:

id  | field1 | field2
----+--------+--------
1   | 1      | 0
2   | 2      | 5
3   | 3      | 0
4   | 3      | 5
5   | 5      | 0

查询应该返回id 2和4(因为field2 = 5)和id 3的行,因为它有field1 = 3,并且有field1 = 3和field2 = 5的行(即带id的行4)

9 个答案:

答案 0 :(得分:1)

您可以尝试在查询中使用的所有列上添加索引:

ALTER TABLE [your_table] ADD INDEX...

以便mysql使用索引中的列值而不是仅使用索引进行行查找。您应该在解释额外列中看到其他使用索引。它可能会加快你的查询速度,但不要指望很多,在这种情况下,如果不改变表模式,文件输出是不可避免的。

如果你决定使用这个索引,你可以安全地删除单个盖子列上的索引,因为复合索引也可以用于盖子查找。

答案 1 :(得分:1)

基于 ...选择所有行,其中有一行具有相同的field1且field2 = 5

SELECT * FROM table t 
WHERE Exists
   (Select * From table
    Where field1 = t.field1
       And field2 = 5)

如果仍然很慢,请检查以确保字段1和字段2都有索引。

答案 2 :(得分:0)

这是非常低效的。为什么不呢:

SELECT * FROM `table`
    WHERE `field2` = 5;

如果我正确理解您的查询,这将产生相同的结果。从表中选择field2为5的所有值。

编辑:这是假设field1和field2在同一个表中,您的查询建议。

答案 3 :(得分:0)

你试过了吗?

SELECT * FROM `table` WHERE `field1` = 5 and `field2` = 5

答案 4 :(得分:0)

另一种尝试 - DISTINCT。对我的数据集进行时间测试显示出一点点改进。

SELECT * FROM `table` 
WHERE `field1` IN (SELECT distinct `field1` FROM `table` WHERE `field2`=5)

最好的选择可能是field1和field2的索引。

答案 5 :(得分:0)

SELECT t1.* 
FROM your_table t1
where field1 in
(
    select field1 
    from your_table
    group by field1
    having sum(field2 = 5) >= 1
)

答案 6 :(得分:-1)

你为什么不这样做:

select * from table where field 2 = 5??

此外,如果表中有数百万行,而字段2中有大量值,则可能需要在field2上使用index。如果它仍然给你table scan查询计划索引不是选择性的,你可以删除它

答案 7 :(得分:-1)

试着理解你为什么不能写作?

SELECT * FROM table WHERE field2 = 5

顺便说一句,缓慢的原因可能不是indexed字段

答案 8 :(得分:-1)

  1. 首先请检查您是否确实需要所有列记录?如果没有,请仅指定所需的列名称。
  2. 主查询和子查询中的'table'是否相同,那么时间是由于自交叉引用(死锁类型)因此使用 SELECT * FROM table WHERE field2 = 5;会工作的。
相关问题