上一章講了如何設計一張好的表,一張好的表自然需要好的sql語句去操作它。本章就來聊聊如何優化sql語句。
1. sql語句優化原則
優化需要優化的query
定位優化物件效能瓶頸
從explain入手
盡可能在索引中完成排序
只取自己需要的column
盡可能避免複雜的join和子查詢
2. 優化limit
[plain]view plain
copy
print?
select * from test1 order by id limit 99999,10
select * from test1 order by id limit 99999,10
原語句雖然使用了id索引,但是相當於從第一行定位到99999行再去掃瞄後10行,相當於掃瞄全表
如果改為
[plain]view plain
copy
print?
select * from test1 where id>=100000 order by id limit 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不需要在記憶體中建立臨時表。
[糟糕的效率]
[plain]view plain
copy
print?
select * from sales2 where company_id not in(select id from company2)
select * from sales2 where company_id not in(select id from company2)
[簡單處理方式]
[plain]view plain
copy
print?
select * from dept, emp where dept.deptno=emp.deptno;
select * from dept, emp where dept.deptno=emp.deptno;
[左外連線,效率最高]
[plain]view plain
copy
print?
select * from dept left join emp on 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資料庫的其他優化方法。
資料庫調優教程(十二) 優化sql語句
上一章講了如何設計一張好的表,一張好的表自然需要好的sql語句去操作它。本章就來聊聊如何優化sql語句。1.sql語句優化原則 優化需要優化的query 定位優化物件效能瓶頸 從explain入手 盡可能在索引中完成排序 只取自己需要的column 盡可能避免複雜的join和子查詢 2.優化limi...
SQL資料庫調優
sql調優的方法 1.1 減少資料的訪問 1 建立並使用正確的索引 2 只通過索引訪問資料 3 優化sql執行計畫 1.2 返回更少的資料 1 資料分頁處理 2 只返回需要的字段 1.3 減少互動的次數 1 batch dml 2 in list 3 設定fetch size 4 使用儲存過程 5 ...
SQL效能優化 資料庫調優 概覽
簡單的目的 執行更快,響應更快,吞吐量更大 不過目標太泛,不夠具體,所以我們需要根據精細的問題定位去調優。通常是以下幾種 資料庫調優不僅有sql,部署 配置 架構也很重要 1.選擇合適dbms 對事務效能和安全要求比較高,選擇商業資料庫如sqlserver,mysql有很多儲存引擎,innodb善於...