MySQL 中SQL 優(yōu)化

一 、 SQL優(yōu)化步驟

1. 查看SQL 執(zhí)行頻率

通過show [session|global]status 命令可以提供服務(wù)器狀態(tài)信
息轮傍,也可以在操作系統(tǒng)上使用mysqladmin extended-status 命令獲得這些消息暂雹。show
[session|global] status 可以根據(jù)需要加上參數(shù)“session”或者“global”來顯示session 級(jí)(當(dāng)
前連接)的統(tǒng)計(jì)結(jié)果和global 級(jí)(自數(shù)據(jù)庫上次啟動(dòng)至今)的統(tǒng)計(jì)結(jié)果。如果不寫创夜,默認(rèn)使
用參數(shù)是“session”杭跪。

1 ) 查詢當(dāng)前連接中SQL執(zhí)行的次數(shù)

SHOW STATUS LIKE 'Com_______';
或
SHOW SESSION STATUS LIKE 'Com_______';

注:_______     :為7個(gè)下劃線。
image.png

2) 查詢當(dāng)前數(shù)據(jù)庫中SQL執(zhí)行的次數(shù)

SHOW GLOBAL STATUS LIKE 'Com_______'; 
image.png

3) 查詢搜索引擎Innodb 中SQL執(zhí)行的次數(shù)

SHOW GLOBAL STATUS LIKE 'Innodb_rows_%';
image.png

2. 定位低效率的SQL語句

1)查看實(shí)時(shí)的SQL執(zhí)行情況

SHOW PROCESSLIST;
image.png

3. 通過 explain 分析執(zhí)行計(jì)劃

EXPLAIN  SELECT * FROM uk_chat_message c WHERE c.channel='weibo';
image.png

字段說明:


image.png

type

type顯示的是訪問類型驰吓,是較為重要的一個(gè)指標(biāo)涧尿,結(jié)果值從好到壞依次是:

null > system > const > eq_ref  > ref  > fulltext  > ref_or_null  > index_merge  > unique_subquery  > index_subquery  > range  > index  > ALL ;

 system > const >  eq_ref  > ref  >  range  > index  > ALL ;

一般來說,得保證查詢至少達(dá)到range級(jí)別檬贰,最好能達(dá)到ref姑廉。

具體含義參考:MySQL EXPLAIN詳解

4. show profile 分析sql

Profiling是從 mysql5.0.3版本以后才開放的。此工具可用來查詢SQL執(zhí)行狀態(tài)翁涤,System lock和Table lock 花多少時(shí)間等等桥言,對(duì)定位一條語句的I/O消耗和CPU消耗 非常重要。(SQL 語句執(zhí)行所消耗的最大兩部分資源就是IO和CPU)

注意:show profile和show Profiles都是不建議使用的迷雪,在mysql后期的版本中可能會(huì)被刪除;官網(wǎng)建議使用Performance Schema

怎么使用

profile默認(rèn)關(guān)閉虫蝶,生產(chǎn)環(huán)境中也建議關(guān)閉章咧;查看當(dāng)前環(huán)境的profile設(shè)置。

show variables like '%profiling%';
image.png

profiling off : 表示profile關(guān)閉能真,ON :表示 開啟 赁严,profiling_history_size 15表示保存最近15條SQL的資源消耗情況。

  1. 開啟profile功能粉铐,可以使用命令:
set global profiling = 1;

然后就可以使用下面命令:

show profiles;
image.png
  1. 查看某一條的具體情況
    SQL格式為:
SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]

type: {
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS
}

例子:

 SHOW PROFILE FOR QUERY 105; 

105 :表示的是:Query_ID .


image.png
  1. 查看CPU耗費(fèi)時(shí)間
 SHOW PROFILE CPU FOR QUERY 105; 

5. trace 分析優(yōu)化器執(zhí)行計(jì)劃

MySQL5.6提供了對(duì)SQL的跟蹤trace疼约,通過trace文件能夠進(jìn)一步了解為什么優(yōu)化器選擇A執(zhí)行計(jì)劃而不是選擇B執(zhí)行計(jì)劃,幫助我們更好地理解優(yōu)化器行為蝙泼。

使用方式:首先打開trace程剥,設(shè)置格式為JSON,設(shè)置trace最大能夠使用的內(nèi)存大小汤踏,避免解析過程中因?yàn)槟J(rèn)內(nèi)存過小而不能夠完整顯示织鲸。

SET OPTIMIZER_TRACE="enabled=on",END_MARKERS_IN_JSON=on;
SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;
image.png

6. MySQL 中SQL語句解析順序

執(zhí)行時(shí) SQL 語句 的順序 :

SELECT DISTINCT
     < select_list >
 FROM
    < left_table > < join_type >
 JOIN < right_table > ON < join_condition >
 WHERE
     < where_condition >
 GROUP BY
     < group_by_list >
 HAVING
     < having_condition >
 ORDER BY
     < order_by_condition >
 LIMIT < limit_number >

機(jī)器讀取 SQL 解析 的順序 :

1 . FROM <left_table>
2 . ON <join_condition>
3 . <join_type> JOIN <right_table>
4 . WHERE <where_condition>
5 . GROUP BY <group_by_list>
6 . HAVING <having_condition>
7 . SELECT
8 . DISTINCT <select_list>
9 . ORDER BY <order_by_condition>
10 . LIMIT <limit_number>

SQL 解析順序 :


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舔腾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搂擦,更是在濱河造成了極大的恐慌稳诚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑踢,死亡現(xiàn)場(chǎng)離奇詭異扳还,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)橱夭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門氨距,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徘钥,你說我怎么就攤上這事衔蹲。” “怎么了呈础?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舆驶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我而钞,道長(zhǎng)沙廉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任臼节,我火速辦了婚禮撬陵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘网缝。我一直安慰自己巨税,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布粉臊。 她就那樣靜靜地躺著草添,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扼仲。 梳的紋絲不亂的頭發(fā)上远寸,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音屠凶,去河邊找鬼驰后。 笑死,一個(gè)胖子當(dāng)著我的面吹牛矗愧,可吹牛的內(nèi)容都是我干的灶芝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼监署!你這毒婦竟也來了颤专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤钠乏,失蹤者是張志新(化名)和其女友劉穎栖秕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晓避,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡簇捍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俏拱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暑塑。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锅必,靈堂內(nèi)的尸體忽然破棺而出事格,到底是詐尸還是另有隱情,我是刑警寧澤搞隐,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布驹愚,位于F島的核電站,受9級(jí)特大地震影響劣纲,放射性物質(zhì)發(fā)生泄漏逢捺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一癞季、第九天 我趴在偏房一處隱蔽的房頂上張望劫瞳。 院中可真熱鬧,春花似錦绷柒、人聲如沸志于。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伺绽。三九已至,卻和暖如春郊楣,著一層夾襖步出監(jiān)牢的瞬間憔恳,已是汗流浹背瓤荔。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工净蚤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人输硝。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓今瀑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橘荠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.如何獲取有性能問題的 SQL 1.通過用戶反饋獲取存在性能問題的 SQL 2.通過慢查日志獲取存在性能問題的 ...
    huxt閱讀 254評(píng)論 0 0
  • 優(yōu)化 SQL 語句的一般步驟 通過 show status 命令了解各種 SQL 的執(zhí)行頻率 MySQL 客戶端連...
    微日月閱讀 472評(píng)論 0 0
  • MySQL學(xué)習(xí)筆記(6) SQL優(yōu)化(1) 優(yōu)化SQL的一般步驟 本文所涉及案例表來自MySQL的案例庫sakil...
    BigfaceMonster閱讀 1,270評(píng)論 0 9
  • 索引用于快速找到與特定的列值的行屿附。如果沒有索引,Mysql會(huì)從第一行順序遍歷直到找到所有滿足條件的行哥童。那么大表就帶...
    小灰灰besty閱讀 385評(píng)論 0 2
  • 原創(chuàng)/恩萍(亞平同學(xué)恩施大峽谷拍照) 小船悠哉浮水面挺份, 碧水如鏡底朝天。 倒影輕晃相呼應(yīng)贮懈, 綠蔭伴舟候佳音匀泊。 峽谷...
    南海浪潮閱讀 1,422評(píng)論 22 49