SQL篇 Mysql的SQL效能調優

2021-10-19 20:49:52 字數 2625 閱讀 1595

伺服器優化:

擴大buffer pool 預設為128m 理論上為記憶體的3/4或者4/5

innodb_buffer_pool_size = 750m

sql設計層面的優化

1 分頁查詢的調優(當limit的偏移量越大時,效能越差)

優化前:

select 字段 from table limit 3000,10

優化後:(利用右表查詢出來的主鍵關聯上左邊,得到其他的字段資訊)

select 字段 from table as t1 righit join (select 主鍵 from table ) as t2 on t1.主鍵=t2.主鍵

2、匯入大量資料的優化

針對myisam的儲存引擎:

alter table tblname disable keys;

loading the data

alter table tblname enable keys;

這兩個命令用來開啟和關閉myisam表非唯一索引的更新

針對innodb表來說:(兩種方案)

1、先給表建立主鍵

2、匯入資料前先關閉唯一性校驗(set unique_checks=0) 匯入結束在開啟(set unique_checks=1)

3、關閉自動提交(set autocommit=0) 匯入結束在開啟(set autocommit=1)

4、 當從乙個文字檔案裝載乙個表時,使用 load data infile

5、利用join比子查詢效率更佳,子查詢需要在記憶體中生成一張臨時表

例如:優化前:

select * from customerinfo where customerid not in (select customerid

from salesinfo

優化後:(customerid 有索引,效率更高)

select * from customerinfo

left join salesinfoon customerinfo.customerid=salesinfo.customerid

where salesinfo.customerid is null

關聯查詢優化:

left join :小表在前(驅動表)

子查詢優化:盡量不要使用not in 或not exists 應該使用left outer join *** is null代替

3、複製表的操作

建議先將資料匯出成檔案,在匯入到目標表

insert … select … 會造成表鎖

我們推薦使用select…into outfile 和 load data infile 的組合來實現,這樣是不會對紀錄進

行鎖定的。

4、 開始profile

show variables lile 『%profile』;

set profiling = 1 (開啟)

檢視執行的sql

show profiles

查詢對應的sql語句的執**況

5、count(*) 找普通索引,找到最小的那棵樹遍歷,包含空值

count(1) 忽略字段,包含空值 (最優,也是找到最小的樹遍歷,主鍵樹肯定是最小的樹 )

count(字段) 走快取,不包含空值

問題sql的篩選步驟

1檢查慢查詢的日誌路徑

show variables like 『%slow_query_log%』;

2開啟慢日誌:

set global slow_query_log=on;

3慢查詢判斷標準(預設查詢時間大於10s的sql語句)

show variables like 『long_query_time』;

mysqldumpslow -v /var/lib/mysql/xx-slow-log按序檢視消耗時間最長的sql

第三方工具分析慢查詢日誌: pt-query-disgest

explain執行計畫裡返回的引數解讀

id: 執行計畫的步驟,數字越大越先執行

select_type:指的是簡單查詢還是複雜查詢

partitions:分割槽

types:連線關係 all代表全表掃瞄(效能最差) 效能從高到低: system>constant>eq_ref>ref>range>index>all

possible_keys :可能使用到的索引

key:真正用的索引

key_length:索引的長度,越小越好

ref:代表索引具體在哪一列上

rows:掃瞄的行數

filtered:返回給客戶端的資料,是個百分數

永遠是小表驅動大表,可以極大降低io,因為如果小表只有20條,那麼只需要在最外層迴圈20次,內層迴圈只要匹配就可以退出。

優化策略:

盡可能在索引中完成排序

不要 select *

僅使用最有效的過濾條件

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

小心使用order by,group by,distinct語句

保證join語句中被驅動表上join條件欄位有索引

MySql效能優化(一) 慢SQL問題排查篇

源自 作為後端開發的一員,我們先 一下資料響應慢的問題。就是使用者從發起網路請求到前端接收到後端響應這個過程耗時比較長的問題。既然說到資料互動,必然離不開資料庫了。關係型資料庫有可能是整個後端資料處理最耗時的乙個環節了。那麼我們如何去判斷是不是由於資料庫的問題導致後端響應慢呢?又該如何去定位哪些sq...

MySQL 查詢效能差的SQL

sql查詢優化 如何獲取效能差的sql 1.通過使用者反饋獲取的存在效能問題的sql 2.通過慢查日誌獲取的存在效能問題的sql show query log 啟動停止慢查詢日誌引數 on set global show query log file 慢查詢日誌存放的位址和檔案 long query...

MySQL的SQL效能優化總結

很多時候,我們的程式出現的 效能問題 其實是我們自己寫的那 坨 的問題,是自己coding的問題,是mysql的dml語句使用的問題。以下是我總結的關於mysql dml語句的使用中需要注意的點。絕大多數情況,是不需要select 的。一旦使用了這種語句,便會讓優化器無法完成索引覆蓋掃瞄這類優化,而...