如何知道數(shù)據(jù)庫(kù)能否承受的數(shù)據(jù)量 如何分析一條SQL的性能?
如何分析一條SQL的性能?在性能測(cè)試中,我們經(jīng)常會(huì)遇到一些sql問(wèn)題。其實(shí)數(shù)據(jù)庫(kù)是近幾年性能測(cè)試中最常見(jiàn)的問(wèn)題,不是IO高就是cpu高,所以數(shù)據(jù)的優(yōu)化在性能測(cè)試過(guò)程中占據(jù)了非常重要的位置。這里我將介紹
如何分析一條SQL的性能?
在性能測(cè)試中,我們經(jīng)常會(huì)遇到一些sql問(wèn)題。其實(shí)數(shù)據(jù)庫(kù)是近幾年性能測(cè)試中最常見(jiàn)的問(wèn)題,不是IO高就是cpu高,所以數(shù)據(jù)的優(yōu)化在性能測(cè)試過(guò)程中占據(jù)了非常重要的位置。這里我將介紹msyql性能調(diào)優(yōu)過(guò)程中常用的三個(gè)利器:
1、慢速查詢(分析sql問(wèn)題)
2.解釋(展示了mysql如何使用索引來(lái)處理select語(yǔ)句和連接表??梢詭椭x擇更好的索引和編寫(xiě)更優(yōu)化的查詢語(yǔ)句)
(查詢SQL將執(zhí)行多長(zhǎng)時(shí)間,并了解CPU/內(nèi)存的使用情況,系統(tǒng)鎖、表鎖執(zhí)行需要多長(zhǎng)時(shí)間等。)
首先,讓我們 讓我們談?wù)刴ysql ■慢速查詢。
1.配置已打開(kāi)
Linux:
添加mysql配置文件
log-slow-qu:。
在的[mysqld]中添加以下語(yǔ)句:
log-slow-qu: w:
使用mysql 自己的命令mysqldumpslow查看。
公共命令
-s ORD:只考慮包含該字符串:的stmts
s,順序,不夠詳細(xì)。我用了,包括看代碼。,主要是c,t,l,r和ac,at,al,ar,按照查詢次數(shù),時(shí)間,鎖時(shí)間,返回的記錄數(shù)排序,前面有-t,表示top n,即返回多少條數(shù)據(jù)-g,后面可以寫(xiě)一個(gè)正則匹配模式,不區(qū)分大小寫(xiě)。
mysqldumpslow-s c-t 20 host-slow . log
mysqldumpslow-s r-t 20 host-slow . log
上面的命令可以顯示20條被訪問(wèn)最多的sql語(yǔ)句和20條返回最多記錄集的sql語(yǔ)句。
myqldumslow-T10-t-g "左連接 "host-slow.log這是根據(jù)時(shí)間返回左連接的前10個(gè)sql語(yǔ)句。
然后是解釋。
如何使用:
執(zhí)行explain select * from RES _ user order by modified time limit 0,1000以獲得以下結(jié)果:
顯示結(jié)果分析:
表|類(lèi)型|可能的關(guān)鍵字|關(guān)鍵字|關(guān)鍵字|引用|行|額外
解釋欄的解釋:
桌子
顯示該行中的數(shù)據(jù)是關(guān)于哪個(gè)表的。
類(lèi)型
這是顯示所使用的連接類(lèi)型的重要列。連接類(lèi)型從最好到最差依次為const、eq_reg、ref、range、indexhe和ALL。
可能的鍵
顯示可能應(yīng)用于此表的索引。如果為空,則沒(méi)有可能的索引。您可以從相關(guān)域的WHERE語(yǔ)句中選擇適當(dāng)?shù)恼Z(yǔ)句。
鍵
實(shí)際使用的索引。如果為NULL,則不使用索引。在極少數(shù)情況下,MYSQL會(huì)選擇一個(gè)不夠優(yōu)化的索引。在這種情況下,可以在SELECT語(yǔ)句中使用US:#)
沒(méi)有找到理想的索引,所以對(duì)于上一個(gè)表中的每個(gè)行組合,MYSQL檢查使用哪個(gè)索引,并使用它從表中返回行。這是使用索引的最慢的連接之一。
使用文件排序
當(dāng)您看到這種情況時(shí),查詢需要優(yōu)化。MYSQL需要采取額外的步驟來(lái)找出如何對(duì)返回的行進(jìn)行排序。它根據(jù)存儲(chǔ)排序鍵值和匹配條件的所有行的連接類(lèi)型和行指針對(duì)所有行進(jìn)行排序。
使用索引
從只使用索引中的信息而不讀取實(shí)際操作的表中返回列數(shù)據(jù),當(dāng)表中所有請(qǐng)求的列都是同一索引的一部分時(shí),會(huì)發(fā)生這種情況。
使用臨時(shí)
當(dāng)您看到這種情況時(shí),查詢需要優(yōu)化。這里,MYSQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)的
表來(lái)存儲(chǔ)結(jié)果,這通常發(fā)生在不同的列集上,而不是ORDER BY上。
使用位置
WHERE子句用于限制哪些行將匹配下一個(gè)表或返回給用戶。這將會(huì)發(fā)生,如果你不 我不想返回表中的所有行,并且連接類(lèi)型是ALL或index,或者查詢有問(wèn)題。
不同連接類(lèi)型的說(shuō)明(按效率順序)
系統(tǒng)
該表只有一行:系統(tǒng)表。這是const連接類(lèi)型的特殊情況。
常數(shù)
表中記錄的最大值可以匹配該查詢(索引可以是主鍵或唯一索引)。因?yàn)橹挥幸恍?,所以這個(gè)值實(shí)際上是一個(gè)常量,因?yàn)镸YSQL先讀取這個(gè)值,然后把它當(dāng)作一個(gè)常量。
eq_ref
在連接中,MYSQL在查詢時(shí)從前面的表中讀取一條記錄,在查詢索引為主鍵或唯一鍵的所有記錄時(shí)使用。
裁判員
只有當(dāng)查詢使用非唯一鍵、主鍵或這些類(lèi)型的一部分(例如,使用最左邊的前綴)時(shí),才會(huì)出現(xiàn)這種連接類(lèi)型。對(duì)于前一個(gè)表的每個(gè)行聯(lián)合,將從該表中讀取所有記錄。這種類(lèi)型很大程度上取決于根據(jù)索引匹配了多少記錄——越少越好。
范圍
這種連接類(lèi)型使用索引返回某個(gè)范圍內(nèi)的行,如gt或lt;當(dāng)你尋找某物時(shí)會(huì)發(fā)生什么。
指數(shù)
這種連接類(lèi)型聯(lián)合掃描前一個(gè)表中的每一條記錄(比全部掃描更好,因?yàn)樗饕ǔP∮诒頂?shù)據(jù))
全部
這對(duì)于一種連接類(lèi)型來(lái)說(shuō),聯(lián)合掃描每個(gè)先前的記錄通常是不好的,應(yīng)該盡可能避免這種情況。
然后是側(cè)寫(xiě)。
我們可以先用它
mysqlgt選擇@ @分析
-
| @ @剖析|
-
| 0 |
-
集合中的1行(0.00秒),查看是否已啟用profile,以及profile ng。
該值為0,可通過(guò)以下方法獲得
mysqlgt集合分析1
查詢正常,0行受影響(0.00秒)
mysqlgt選擇@ @分析
-
| @ @剖析|
-
| 1 |
-
集合中的1行(0.00秒)
啟用。啟用概要分析后,我們執(zhí)行一個(gè)查詢語(yǔ)句,例如:
SELECT * FROM res_user ORDER BY修改的時(shí)間限制
0,1000
mysqlgt顯示個(gè)人資料
- - -
-
|查詢ID |持續(xù)時(shí)間|查詢|
- - -
-
| 1 | 0.00012200 |選擇@@profiling |
| 2 | 1.54582000 |從res_user中選擇res_id
按修改的時(shí)間限制0,3 |排序
- - -
-
集合中的2行(0.00秒)注意:Query_ID表示剛剛執(zhí)行的查詢語(yǔ)句。
mysqlgt顯示個(gè)人資料f或查詢2
- -
|狀態(tài)|持續(xù)時(shí)間|
- -
|開(kāi)始| 0.000013 |
|檢查查詢| 0.000035 |的查詢緩存
|打開(kāi)表格| 0.000009 |
|系統(tǒng)鎖定| 0.000002 |
|表鎖| 0.000015 |
| init | 0.000011 |
|優(yōu)化| 0.000003 |
|統(tǒng)計(jì)| 0.000006 |
|正在準(zhǔn)備| 0.000006 |
|正在執(zhí)行| 0.000001 |
|排序結(jié)果| 1.545565 |
|發(fā)送數(shù)據(jù)| 0.000038 |
| end | 0.000003 |
|查詢結(jié)束| 0.000003 |
|正在釋放項(xiàng)目| 0.000069 |
|將結(jié)果存儲(chǔ)在查詢緩存中| 0.000004 |
|記錄慢速查詢| 0.000001 |
|記錄慢速查詢| 0.000033 |
|清理| 0.000003 |
- -
集合中有19行(0.00秒)
結(jié)論:我們可以看到這條查詢語(yǔ)句的執(zhí)行過(guò)程和時(shí)間,總時(shí)間約為1.545s,此時(shí)我們?cè)賵?zhí)行一次。
mysqlgt通過(guò)修改時(shí)間限制0,3從res_user ORDER中選擇res_id
-
| res_id |
-
| 1000305 |
| 1000322 |
| 1000323 |
-
集合中的3行(0.00秒)
mysqlgt顯示個(gè)人資料
-- - -
|查詢ID |持續(xù)時(shí)間|查詢|
- - -
| 1 | 0.00012200 |選擇@@profiling |
| 2 | 1.54582000 |根據(jù)修改的時(shí)間限制0,3 |從res_user ORDER中選擇res_id
| 3 | 0.00006500 | SELECT R
數(shù)據(jù)庫(kù)數(shù)據(jù)量有多大?
這會(huì)占用文件系統(tǒng)的空間。例如,表空間的大小是10g,使用1g。你的統(tǒng)計(jì)是按照10g計(jì)算的。select sum(bytes)/1024/1024/1024 from DBA _ segments有多少數(shù)據(jù)?