上回說到 mysql 索引的使用,是不是有了索引就一定能讓查詢效率變高呢?很顯然不是的。有很多情況會影響 sql 執行效率。先不說資料庫服務的硬體配置,以及執行 sql 時那一瞬間的系統負載情況,今天主要**如何優化 sql 本身。
mysql 的慢查詢日誌是 mysql 提供的一種日誌記錄,它用來記錄在 mysql 中響應時間超過閥值的語句,具體指執行時間超過long_query_time 值的 sql,則會被記錄到慢查詢日誌中。long_query_time 的預設值為 10,意思是執行 10s 以上的語句。預設情況下,mysql 資料庫並不啟動慢查詢日誌,需要我們手動來設定這個引數。如果不是調優需要的話,一般不建議啟動該引數,因為開啟慢查詢日誌會或多或少帶來一定的效能影響。
即便有效能消耗,通常線上業務資料庫都會開啟慢查詢日誌,slow_query_log 可以設定是否開啟慢查詢日誌,1 表示開啟,0 表示關閉。long_query_time 根據業務需求設定不同閾值,oltp 業務下 1s 以上的 sql 可以認為是慢 sql。
當我們通過慢查詢日誌獲取到 sql 後,通常會從以下幾個方面分析:
sql 是不是過於複雜
資料量是不是過大
sql 執行計畫
oltp 場景下,強烈建議單條 sql 中關聯的表不要超過兩張,並且盡量使用主鍵 join ,至少也是通過索引做等值關聯。即便是 olap 場景下關聯的表也不宜過多。
如果 sql 中用到的表數量巨大,比如單錶資料量上億。這時候 sql 再怎麼優化效能都難有質的提公升,應該先通過分庫分表來降低單錶的大小,下一步才是 sql 優化。
優化 sql 通常會用到 explain 關鍵字來檢視 sql 的執行計畫。例如如下 sql:
and f.created_time <= '2020-07-10';
id
select_type
table
type
possible_keys
keykey_len
refrows
extra
1primary
all3075093
1primary
ref191
c.order_number
10using where
1primary
ref62
c.number151
primary
meq_ref
mobile
mobile
191d.mobile
1using where; using index
5derived
loanorder
all1861908
4derived
activationlog
index
idx_number
idx_number
624346857
using where
2derived
all3075093
using temporary; using filesort
3derived
aindex
order_number
order_number
1913075093
using where; using temporary; using filesort
簡單介紹一下結果表常用字段的含義:
type: 查詢使用了何種型別,它在 sql優化中是乙個非常重要的指標,以下效能從好到壞依次是:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。說一下常見的值:
key: 查詢中實際使用到的索引,若沒有使用索引,顯示為null。
key_len: 表示 where 條件中查詢用到的索引長度(位元組數),原則上長度越短越好 。
possible_keys:表示在 mysql 中通過哪些索引,能讓我們在表中找到想要的記錄,一旦查詢涉及到的某個欄位上存在索引,則索引將被列出,但這個索引並不一定會是最終查詢資料時所被用到的索引。
ref: 常見的有 const,func,null,欄位名。
rows: 以表的統計資訊和索引使用情況,估算要找到我們所需的記錄,需要讀取的行數,一般情況下 rows 值越小越好。
extra: 額外的資訊會在 extra 字段顯示。
最後補充兩點:
當 possible_keys 有多個,但是執行計畫中用到的 key 不是最優的情況下,可以通過 force_index 語句手動指定某張表某個索引。
join 演算法決定 join 時盡量小表驅動大表,並且盡量所有被驅動表都直接與驅動連線,盡量不要被驅動與被驅動表連線。
sql某字段不包含某值 SQl基礎查詢
1.select基本查詢語句 1 列的查詢 select 列名1 列名2 from 表名 如 從學生表中查詢姓名和性別兩列 2 為列設定別名as sql語句使用as關鍵字為列設定別名,別名使用中文時需要用雙引號括起來,as可省略 select stu name as 姓名 as 性別 from st...
sql 包含空格 初識SQL
資料庫中儲存的資料是類似於excel中的行和列,行被稱為記錄,裡面是乙個具體等的記錄,列被稱為子的,代表儲存資料的專案。sql 語句可以分為以下三類.ddl data definition language,資料定義語言 用來建立或者刪除儲存資料用的 資料庫以及資料庫中的表等物件。ddl 包含以下幾...
改寫SQL優化SQL
好久 沒有寫部落格了,主要 是因為 實際工作中 沒有遇到有價值的 案例。但是 不寫吧,總覺得 惦記著 什麼,略記.今天審核的sql有幾個問題,程式設計師 寫的sql,可能不注重效率,我想這個是很多dba 深有感悟的,很多sql 其實只要稍微改寫下,會得到很多的驚喜。廢話 不多說上sql 優化sql,...