1.大多數(shù)情況,MySQL會將獨立子查詢轉化為相關子查詢,這樣就影響了SQL執(zhí)行效率。
select name from student where id in (select student_id from lesson );
select name from student where exists (select 1 from lesson where student.id = lesson.student_id);
如上,MySQL的優(yōu)化器會將 in 的獨立子查詢優(yōu)化為exists的相關子查詢。執(zhí)行效率變?yōu)镺(N+M*N)而不是O(N+M)。我們可以具體優(yōu)化相關子查詢的參數(shù)條件來優(yōu)化。
2.可以用explain 查看SQL具體的如何執(zhí)行的參數(shù),和具體如何執(zhí)行的 explain extended詳解 。
3.查看慢查詢?nèi)罩荆榭次锢鞩O 邏輯IO次數(shù),top 10。
4.關聯(lián)子查詢優(yōu)化,建唯一索引,使用派生表(避免相關子查詢和外部查詢的多次比較操作)。
select orderid,customerid,emploeeid,orderdate,requireddate from orders as a
where orderdate=(select max(orderdate) from orders as b where a.employeeid=b.employeeid);
建立索引
create unique indes idx_empid_od_rd_oid on orders(employeeid,orderdate,requireddate,orderid)
使用派生表
select a.orderid,a.customerid,a.employeeid,b.orderdate,requireddate from orders as a,
(select employeeid,max(orderdate) as orderdate from orderd group by employeeid) as b
where a.employeeid=b.employeeid and a.orderdate=b.orderdate;