資料庫調優教程(十二) 優化sql語句

2021-06-30 16:59:20 字數 1778 閱讀 6868

上一章講了如何設計一張好的表,一張好的表自然需要好的sql語句去操作它。本章就來聊聊如何優化sql語句。

1.      sql語句優化原則

優化需要優化的query

定位優化物件效能瓶頸

從explain入手

盡可能在索引中完成排序

只取自己需要的column

盡可能避免複雜的join和子查詢

2.     優化limit

[plain]view plain

copy

select * from test1 order by id limit 99999,10  

原語句雖然使用了id索引,但是相當於從第一行定位到99999行再去掃瞄後10行,相當於掃瞄全表

如果改為

[plain]view plain

copy

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

select * from sales2 where company_id not in(select id from company2)  

[簡單處理方式]

[plain]view plain

copy

select * from dept, emp where dept.deptno=emp.deptno;   

[左外連線,效率最高]

[plain]view plain

copy

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

這些動作可以改在客戶端執行,它們增加了額外的開銷

資料庫調優教程 優化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善於...