php - How would you optimize the following mysql query -
can me in optimizing mysql query in php, takes 100 sec.
select distinct a.x, a.y, a.z, tableaa inner join( tablebb b) on(a.x = b.x) or (a.x = b.m) b.n = '$input' or a.y = '$input' or a.z = '$input'
tableaa has 1 million enteries tablebb has 9 million enteries
is there anyother way write query?
edit:
tablebb has primary index on connection between n, x ,y. , indexes on x, n, m
tableaa has primary index on x , indexes on y, z
your query (formatted in way can better understand it) is:
select distinct a.x, a.y, a.z tableaa inner join tablebb b on a.x = b.x or a.x = b.m b.n = '$input' or a.y = '$input' or a.z = '$input';
this complex optimization because of or
clauses. first inclination write 2 joins instead of or
:
select distinct a.x, a.y, a.z tableaa left outer join tablebb b on a.x = b.x , b.n = '$input' left outer join tablebb b2 on a.x = b2.m , b2.n = '$input' (b.n not null or b2.n not null) , (a.y = '$input' or a.z = '$input')
this more complicated, can add indexes on b(n, x)
, b(n, m)
facilitate processing.
handling or
condition on a
complicated. can try having 2 indexes: a(y, x, z)
, a(z, x, y)
, see if used. otherwise, can split 2 queries:
(select a.x, a.y, a.z tableaa left outer join tablebb b on a.x = b.x , b.n = '$input' left outer join tablebb b2 on a.x = b2.m , b2.n = '$input' (b.n not null or b2.n not null) , a.y = '$input' ) union (select a.x, a.y, a.z tableaa left outer join tablebb b on a.x = b.x , b.n = '$input' left outer join tablebb b2 on a.x = b2.m , b2.n = '$input' (b.n not null or b2.n not null) , a.z = '$input' )
this version should use indexes mentioned above. of course, need check explain
plans see if case. might optimization.
if there way simplify conditions and
rather or
, such optimization easier.
Comments
Post a Comment