我有一个数据库表,我想要选择所有行,其中有一行具有相同的field1
和field2
= 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)
答案 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)
答案 8 :(得分:-1)
table
WHERE field2
= 5;会工作的。