[英]How would you optimize the following mysql query
任何人都可以帮助我优化php中的mysql查询,它最多需要100秒。
SELECT DISTINCT
A.X,
A.Y,
A.Z,
FROM TableAA AS A
INNER JOIN( TableBB AS B)
ON(A.X = B.X) OR (A.X = B.M)
WHERE B.N = '$input' OR
A.Y = '$input' OR
A.Z = '$input'
TableAA拥有100万个肠子TableBB拥有900万个肠子
还有其他写此查询的方式吗?
编辑:
TableBB在N,X,Y之间的连接上具有主索引。 以及在X,N,M上的索引
TableAA在X上具有PRIMARY索引,在Y,Z上具有索引
您的查询(以我可以更好地理解它的格式)是:
SELECT DISTINCT A.X, A.Y, A.Z
FROM TableAA A INNER JOIN
TableBB B
ON A.X = B.X OR A.X = B.M
WHERE B.N = '$input' OR A.Y = '$input' OR A.Z = '$input';
由于所有or
子句,优化起来很复杂。 我的第一个倾向是使用两个联接而不是or
来编写它:
SELECT DISTINCT A.X, A.Y, A.Z
FROM TableAA A left outer JOIN
TableBB B
ON A.X = B.X and B.N = '$input' left outer join
TableBB b2
on A.X = B2.M and B2.N = '$input'
WHERE (B.N is not null or B2.N is not null) and (A.Y = '$input' OR A.Z = '$input')
这更加复杂,但是您现在可以在B(N, X)
和B(N, M)
上添加索引以方便处理。
处理A
的or
条件也很复杂。 您可以尝试使用两个索引: A(Y, X, Z)
和A(Z, X, Y)
并查看它们是否被使用。 否则,您可以将其分为两个查询:
(SELECT A.X, A.Y, A.Z
FROM TableAA A left outer JOIN
TableBB B
ON A.X = B.X and B.N = '$input' left outer join
TableBB b2
on A.X = B2.M and B2.N = '$input'
WHERE (B.N is not null or B2.N is not null) and A.Y = '$input'
)
union
(SELECT A.X, A.Y, A.Z
FROM TableAA A left outer JOIN
TableBB B
ON A.X = B.X and B.N = '$input' left outer join
TableBB b2
on A.X = B2.M and B2.N = '$input'
WHERE (B.N is not null or B2.N is not null) and A.Z = '$input'
)
此版本应使用上述索引。 当然,您需要检查explain
计划以查看是否确实如此。 但这可能有助于优化。
如果有任何方法可以简化条件,则条件为and
而不是or
,则这种优化会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.