sql 不包含 SQL 優化路在何方

2021-10-11 23:03:00 字數 2449 閱讀 1332

上回說到 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,...