佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > MySQL SQL語(yǔ)句分析與查詢(xún)優(yōu)化詳解

MySQL SQL語(yǔ)句分析與查詢(xún)優(yōu)化詳解

熱門(mén)標(biāo)簽:百度競(jìng)價(jià)排名 Linux服務(wù)器 地方門(mén)戶(hù)網(wǎng)站 鐵路電話(huà)系統(tǒng) 網(wǎng)站排名優(yōu)化 服務(wù)外包 呼叫中心市場(chǎng)需求 AI電銷(xiāo)

如何獲取有性能問(wèn)題的SQL

1、通過(guò)用戶(hù)反饋獲取存在性能問(wèn)題的SQL
2、通過(guò)慢查詢(xún)?nèi)罩精@取性能問(wèn)題的SQL
3、實(shí)時(shí)獲取存在性能問(wèn)題的SQL

使用慢查詢(xún)?nèi)罩精@取有性能問(wèn)題的SQL

首先介紹下慢查詢(xún)相關(guān)的參數(shù)

1、slow_query_log 啟動(dòng)定制記錄慢查詢(xún)?nèi)罩?br /> 設(shè)置的方法,可以通過(guò)MySQL命令行設(shè)置set global slow_query_log=on
或者修改/etc/my.cnf文件,添加slow_query_log=on

2、slow_query_log_file 指定慢查詢(xún)?nèi)罩镜拇鎯?chǔ)路徑及文件
建議日志存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開(kāi)存儲(chǔ)

3、long_query_time 指定記錄慢查詢(xún)?nèi)罩維QL執(zhí)行時(shí)間的閾值
① 記錄所有符合條件的SQL
② 數(shù)據(jù)修改語(yǔ)句
③ 包括查詢(xún)語(yǔ)句
④ 已經(jīng)回滾的SQL

注意:
時(shí)間可以精確到微秒,存儲(chǔ)的單位是秒,默認(rèn)值為10秒,例如我們想查詢(xún)1微秒的值,這里就要設(shè)置成0.001秒

4、log_queries_not_using_indexes 是否記錄未使用索引的SQL

5、log_output 設(shè)置慢日志查詢(xún)的保存格式(如果需要保存為文件請(qǐng)修改成FILE)

慢查詢(xún)使用日志中記錄的信息

1、第一行記錄的信息為使用sbtest做的測(cè)試
2、第二行記錄的信息為慢查詢(xún)?nèi)罩镜臅r(shí)間
3、第三行記錄的信息為所使用鎖的時(shí)間
4、第四行記錄的信息為返回的數(shù)據(jù)行數(shù)
5、第五行記錄的信息為掃描數(shù)據(jù)的行數(shù)
6、第六行記錄的信息為時(shí)間戳
7、第七行記錄的信息為查詢(xún)的SQL語(yǔ)句

使用慢查詢(xún)獲取有性能問(wèn)題的SQL

常使用的慢查詢(xún)?nèi)罩痉治龉ぞ?mysqldumpslow)
介紹:匯總除查詢(xún)條件外其他完全相同的SQL,并將分析結(jié)果按照參數(shù)中所指定的順序輸出


慢查詢(xún)?nèi)罩緦?shí)例

慢查詢(xún)的相關(guān)配置設(shè)置

命令行執(zhí)行參數(shù)查看分析的結(jié)果

]# cd /var/lib/mysql/log
]# mysqldumpslow -s r -t 10 slow-mysql

常使用的慢查詢(xún)?nèi)罩痉治龉ぞ?pt-query-digest)

使用工具前,需要先安裝該工具,如果已有,可略過(guò)下面的安裝步驟
1、perl模塊
]# yum install -y perl-CPAN perl-Time-HiRes perl-IO-Socket-SSL perl-DBD-mysql perl-Digest-MD5
2、切換至src目錄下載rpm包
]# cd /usr/local/src
]# wget https://www.percona.com/downloads/percona-toolkit/3.0.7/binary/redhat/7/x86_64/percona-toolkit-3.0.7-1.el7.x86_64.rpm

3、安裝工具包
]# rpm -ivh percona-toolkit-3.0.7-1.el7.x86_64.rpm

執(zhí)行命令分析慢查詢(xún)?nèi)罩?/strong>

]# pt-query-digest --user=root --password=redhat --host=127.0.0.1 slow-mysql > slow.rep
分析的結(jié)果如下

MySQL服務(wù)器處理查詢(xún)請(qǐng)求的整個(gè)過(guò)程

1、客戶(hù)端發(fā)送SQL請(qǐng)求給服務(wù)器
2、服務(wù)器檢查是否存在在緩存服務(wù)器中命中該SQL
3、服務(wù)器端進(jìn)行SQL解析,預(yù)處理,再由優(yōu)化器對(duì)應(yīng)執(zhí)行計(jì)劃
4、根據(jù)執(zhí)行計(jì)劃,調(diào)用存儲(chǔ)引擎API來(lái)查詢(xún)數(shù)據(jù)
5、將結(jié)果返回給客戶(hù)端

查詢(xún)緩存對(duì)SQL性能的影響

1、優(yōu)先檢查整個(gè)查詢(xún)是否命中查詢(xún)緩存中的數(shù)據(jù)
2、通過(guò)一個(gè)對(duì)大小寫(xiě)敏感的哈希查找實(shí)現(xiàn)的

查詢(xún)緩存的優(yōu)化參數(shù)

query_cache_type 設(shè)置查詢(xún)緩存是否可用
ON,OFF,DEMAND

注意:DEMAND表示只有在查詢(xún)語(yǔ)句中使用SQL——CACHE和SQL_NO_CACHE來(lái)控制是否需要緩存

query_cache_size 設(shè)置查詢(xún)緩存的內(nèi)存大小

query_cache_limit 設(shè)置查詢(xún)緩存可用存儲(chǔ)的最大值

query_cache_wlock_invalidate 設(shè)置數(shù)據(jù)表被鎖后是否返回緩存中的數(shù)據(jù)(默認(rèn)是關(guān)閉的,建議也是關(guān)閉的此選項(xiàng))

query_cache_min_res_unit 設(shè)置查詢(xún)緩存分配的內(nèi)存塊最小的值

會(huì)造成MySQL生成錯(cuò)誤的執(zhí)行計(jì)劃的原因

1、統(tǒng)計(jì)信息不準(zhǔn)確
2、執(zhí)行計(jì)劃中的成本估算不等同于實(shí)際的執(zhí)行計(jì)劃的成本
3、MySQL優(yōu)化器所認(rèn)為的最優(yōu)可能與你所認(rèn)為的最優(yōu)不一樣
4、MySQL從不考慮其他并發(fā)的查詢(xún),這可能會(huì)影響當(dāng)前查詢(xún)數(shù)據(jù)
5、MySQL有時(shí)候也會(huì)基于一些固定的規(guī)則來(lái)生成執(zhí)行計(jì)劃
6、MySQL不會(huì)考慮不受其控制的成本

MySQL優(yōu)化器可優(yōu)化的SQL類(lèi)型

1、重新定義表的關(guān)聯(lián)順序
優(yōu)化器會(huì)根據(jù)統(tǒng)計(jì)信息來(lái)決定表的關(guān)聯(lián)順序

2、將外鏈接轉(zhuǎn)換成內(nèi)連接
where條件和庫(kù)表結(jié)構(gòu)等

3、使用等價(jià)變換規(guī)則
(5=5 and a > 5)將會(huì)被改寫(xiě)成 a > 5

4、優(yōu)化count(), min()和max()
select tables optimized away
優(yōu)化器已經(jīng)從執(zhí)行計(jì)劃中移除了該表,并以一個(gè)常數(shù)取而代之

5、將一個(gè)表達(dá)式轉(zhuǎn)換為常數(shù)表達(dá)式

6、使用等價(jià)變換規(guī)則

7、子查詢(xún)優(yōu)化

8、對(duì)in()條件進(jìn)行優(yōu)化

如何確定查詢(xún)處理各個(gè)階段所消耗的時(shí)間

使用profile

set profiling = 1;
執(zhí)行查詢(xún):
show profiles;

show profile for query N;

查詢(xún)的每個(gè)階段所消耗的時(shí)間

使用profile查看語(yǔ)句所消耗的時(shí)間

特定的SQL查詢(xún)優(yōu)化

1、利用主從切換的原理進(jìn)行大表的表結(jié)構(gòu)修改,例如,現(xiàn)在從服務(wù)器上修改,修改完畢以后,進(jìn)行主從切換,再在原來(lái)老的主上進(jìn)行大表的修改,存在一定的風(fēng)險(xiǎn)。
2、在主服務(wù)器上創(chuàng)建于一個(gè)新的表,表結(jié)構(gòu)就是將要修改大表后表結(jié)構(gòu),再把老表的數(shù)據(jù)重新導(dǎo)入到新表中,并在老表中建立一系列的觸發(fā)器,把老表的數(shù)據(jù)同步更新到新表中,當(dāng)老表中的數(shù)據(jù)全部同步到新表以后,再對(duì)老表加排它鎖,把新表改成老表的名稱(chēng),刪除重命名的老表,如下圖所示


使用pt-online-schema-change命令來(lái)修改大表,具體操作如下圖所示

上圖的參數(shù)解釋

--alter 所使用的sql語(yǔ)句
--user 數(shù)據(jù)庫(kù)的登錄用戶(hù)
--password 登錄用戶(hù)的密碼
D 指定所有修改表的數(shù)據(jù)庫(kù)名稱(chēng)
t 表的名稱(chēng)
--charset 指定數(shù)據(jù)庫(kù)的字符串
--excute 執(zhí)行

原創(chuàng)作品,轉(zhuǎn)載請(qǐng)注明出處

您可能感興趣的文章:
  • 分析Mysql表讀寫(xiě)、索引等操作的sql語(yǔ)句效率優(yōu)化問(wèn)題
  • Mysql查詢(xún)最近一條記錄的sql語(yǔ)句(優(yōu)化篇)
  • 提升MYSQL查詢(xún)效率的10個(gè)SQL語(yǔ)句優(yōu)化技巧
  • MySQL SQL語(yǔ)句優(yōu)化的10條建議
  • 淺談MySQL中優(yōu)化sql語(yǔ)句查詢(xún)常用的30種方法
  • MySQL優(yōu)化SQL語(yǔ)句的技巧

標(biāo)簽:崇左 蘭州 衡水 湘潭 湖南 銅川 黃山 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL SQL語(yǔ)句分析與查詢(xún)優(yōu)化詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266
    龙泉市| 新沂市| 前郭尔| 塔河县| 孟州市| 淮北市| 铜川市| 怀宁县| 和静县| 汝州市| 高雄县| 沈阳市| 石门县| 马鞍山市| 天水市| 木兰县| 白银市| 五寨县| 福州市| 隆回县| 周宁县| 大丰市| 义乌市| 金华市| 阜城县| 高雄市| 贡嘎县| 辉县市| 安庆市| 长治市| 斗六市| 施甸县| 保定市| 海丰县| 大庆市| 山阳县| 盖州市| 阳山县| 丰城市| 类乌齐县| 梁河县|