資料庫調優教程(十二) 最佳化sql語句,調優sql
五、 最佳化Sql語句
上一章講了如何設計一張好的表,一張好的表自然需要好的sql語句去操作它。本章就來聊聊如何最佳化sql語句。
1. Sql語句最佳化原則
最佳化需要最佳化的Query
定位最佳化對象效能瓶頸
從Explain入手
儘可能在索引中完成排序
只取自己需要的Column
儘可能避免複雜的join和子查詢
2. 最佳化limit
select * from test1 order by id limit 99999,10
原語句雖然使用了id索引,但是相當於從第一行定位到99999行再去掃描後10行,相當於掃描全表
如果改為
select * from test1 where id>=100000 order by id limit 10
則直接定位到100000尋找
3. 盡量避免SELECT *命令
4. 不讓排序
在使用group by 分組查詢時,預設分組後,還會排序,可能會降低速度.
比如:
在group by後面增加 order by null 就可以防止排序.
5. 使用串連來替代子查詢
有些情況下,可以使用串連來替代子查詢。因為使用join,MySQL不需要在記憶體中建立暫存資料表。
[糟糕的效率]
select * from sales2 where company_id not in(select id from company2)
[簡單處理方式]
select * from dept, emp where dept.deptno=emp.deptno;
[左外串連,效率最高]
select * from dept left join emp on dept.deptno=emp.deptno;
6. 利用LIMIT 1取得唯一行
有時,當你要查詢一張表是,你知道自己只需要看一行。在這種情況下,增加一個LIMIT 1會令你的查詢更加有效。這樣資料庫引擎發現只有1後將停止掃描,而不是去掃描整個表或索引
7. 使用 EXISTS代替in
EXISTS要遠比IN的效率高。裡面關係到full table scan和range scan。幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢
8. 不要手賤
沒有必要時不要用DISTINCT和ORDER BY
這些動作可以改在用戶端執行,它們增加了額外的開銷
本章結束,下一章聊聊mysql資料庫的其他最佳化方法。