我在我的表上创建索引,然后使用两种不同的方式触发相同的查询:我在MySql上运行这些查询,但总是得到不同的执行时间,有时候第一次更快,有时是第二次......这就是为什么我想要专家意见.Queries是 第一个是
select t1.field
from table1 as t1
where t1.field in (
select t2.field
from table2 as t2
where t2.field in (
select t3.field from table3 as t3
where t3.field='something'))
第二次使用join作为
select t1.field
from table1 as t1,
table2 as t2,
table3 as t3
where t1.field = t2.field
and t2.field = t3.field
and t3.field='something'
所以任何人都可以告诉我哪些会给我带来高性能以及为什么我的数据库太大了......所以我想知道哪种是在MySql中编写此类查询的更好方法。
答案 0 :(得分:3)
第二种方法比第一种方法更快,
正确的索引将在t1(字段),t2(字段),t3(字段)上有索引
当您使用第一种方法的解释时,您将看到mysql将为两个子查询创建两个派生表
而在第二种方法中,mysql检查的行将远远少于
答案 1 :(得分:2)
只有您才能真正回答您的问题,因为只有您可以访问您的查询实际运行的硬件,软件,架构,索引,数据等的确切组合。
查看MySQL EXPLAIN
语句。
答案 2 :(得分:2)
使用EXPLAIN对查询进行前缀,以查看它们的分析方式。
最好避免使用WHERE子句中的子查询,因为它们可能需要为每一行执行。当需要子查询时,最好在FROM子句中使用它,创建derived table。 E.g。
SELECT *
FROM
some_table
INNER JOIN (
SELECT * FROM another_table
) derived_table ON some_table.id = derived_table.id
WHERE
some_table.x = 'y';
答案 3 :(得分:2)
在参与比较的列上使用join和create index。 然后使用“Explain”检查性能:)