国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
MySQL慢查詢優(yōu)化 EXPLAIN詳解


摘要:慢查詢排查: show status; // 查詢mysql數(shù)據(jù)庫的一些運行狀態(tài),show status like 'uptime'; // 查看mysql數(shù)據(jù)庫啟動多長時間,myisam存儲引擎長時間啟動需要進(jìn)行碎片整理,查看慢查詢,show status like 'slow_queries'...

慢查詢排查

show status; // 查詢mysql數(shù)據(jù)庫的一些運行狀態(tài) show status like 'uptime'; // 查看mysql數(shù)據(jù)庫啟動多長時間,myisam存儲引擎長時間啟動需要進(jìn)行碎片整理 查看慢查詢 show status like 'slow_queries'; 查詢慢查詢時間 show variables like 'long_query_time'; 設(shè)置慢查詢時間 set long_query_time = 0.5;

分析執(zhí)行情況 EXPLAIN詳解

分析查詢語句的執(zhí)行情況,可以分析出所查詢的表的一些特征:EXPLAIN/DESCRIBE/DESCSELECT * FROM...;

每個字段說明:

id:SELECT標(biāo)識符。這是SELECT的查詢序列號。

select_type:表示SELECT語句的類型。它可以是以下幾種取值:

    SIMPLE:表示簡單杳詢,其中不包括連接查詢和子查詢;

    PRIMARY:表示主查詢,或者最外層的查詢語句;

    UNION:表示連接查詢的第2個或后面的查詢語句;

    DEPENDENT UNION:連接查詢中的第2個或后面的SELECT語句,取決于外面的查詢;

    UNION RESULT:連接查詢的結(jié)果;

    SUBQUERY:子查詢中的第一個SELECT語句;

    DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決于外面的查詢;

    DERIVED:導(dǎo)出表的SELECT (FROM語句的子查詢)。

table:表示查詢的表。

type:表示表的連接類型。下面按照從最佳類型到最差類型的順序給出各種連接類型:

(1) system 該表僅有一行的系統(tǒng)表。這是const連接類型的一個特例。 (2) const 數(shù)據(jù)表最多只有一個匹配行,它將在查詢開始時被讀取,并在余下的査詢優(yōu)化中作為常量對待。const表查詢速度很快,因為它們只讀取一次。const用于使用常數(shù)值比較PRIMARY KEY或UNIQUE索引的所有部分的場合。 在下面查詢中,tb1_name可用const表: SELECT * from tb1_name WHERE primary_key=1; SELECT * from tb1_name WHERE primary_key_part1=1 AND primary_key_part2=2 (3) eq_ref 對于每個來自前面的表的行組合,從該表中讀取一行。當(dāng)一個索引的所有部分都在查詢中使用,并且索引是UNIQUE或者PRIMARY KEY時,即可使用這種類型。 eq_ref可以用于使用“=”操作符比較帶索引的列。比較值可以為常量或者一個在該表前面所讀取的表的列的表達(dá)式。 在下面例子中,MySQL可以使用eq_ref來處理ref_tables: SELECT * FROM ref_table,other_table WHERE ref_table.key_cloumn = other_table.cloumn; SELECT * FROM ref_table, other_tbale WHERE ref_table.key_cloumn_part1 = other_table.cloumn AND ref_table.key_cloumn_part2 = 1; (4)ref 對于來自前面的表的任意組合,將從該表中讀取所有匹配的行。這種類型用于索引既不是UNIQUE也不是PRIMARY KEY的情況,或者查詢中使用了索引列在左子集,既索引中左邊的部分列組合。ref可以用于使用=或者<=>操作符的帶索引的列。 以下的幾個例子中,mysql將使用 ref 來處理ref_table: select * from ref_table where key_column=expr; select * from ref_table,other_table where ref_table.key_column=other_table.column; select * from ref_table,other_table where ref_table.key_column_part1=other_table.column and ref_table.key_column_part2=1; (5)ref_or_null 這種連接類型類似ref,不同的是mysql會在檢索的時候額外的搜索包含null值的記錄。在解決子查詢中經(jīng)常使用該鏈接類型的優(yōu)化。 在以下的例子中,mysql使用ref_or_null 類型來處理 ref_table: select * from ref_table where key_column=expr or key_column is null; (6)index_merge 該鏈接類型表示使用了索引合并優(yōu)化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關(guān)鍵元素。 (7)unique_subquery 該類型替換了下面形式的IN子查詢的ref: value in (select primary_key from single_table where some_expr) (8)index_subquery 這種連接類型類似 unique_subquery??梢蕴鎿QIN子查詢,不過它用于在子查詢中沒有唯一索引的情況下, 例如以下形式: value in (select key_column from single_table where some_expr) (9)range 只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。ken_len包含所使用索引的最長關(guān)鍵元素。當(dāng)使用 =, <>, >,>=, <, <=, is null, <=>, between, 或 in操作符,用常量比較關(guān)鍵字列時,類型為range。 下面介紹幾種檢索制定行的情況: select * from tbl_name where key_column = 10; select * from tbl_name where key_column between 10 and 20; select * from tbl_name where key_column in (10,20,30); select * from tbl_name where key_part1= 10 and key_part2 in (10,20,30); (10)index 連接類型跟ALL一樣,不同的是它只掃描索引樹。它通常會比ALL快點,因為索引文件通常比數(shù)據(jù)文件小。 (11)ALL 對于前面的表的任意行組合,進(jìn)行完整的表掃描。如果第一個表沒有被標(biāo)識為const的話就不大好了,在其他情況下通常是非常糟糕的。正常地,可以通過增加索引使得能從表中更快的取得記錄以避免ALL。

possible_keys

        possible_keys字段是指MySQL在搜索表記錄時可能使用哪個索引。如果這個字段的值是NULL,就表示沒有索引被用到。這種情況下,就可以檢查WHERE子句中哪些字段哪些字段適合增加索引以提高查詢的性能。創(chuàng)建一下索引,然后再用explain 檢查一下。

key

       key字段顯示了MySQL實際上要用的索引。當(dāng)沒有任何索引被用到的時候,這個字段的值就是NULL。想要讓MySQL強行使用或者忽略在 possible_keys字段中的索引列表,可以在查詢語句中使用關(guān)鍵字force index, use index或 ignore index。參考SELECT語法。

key_len

        key_len 字段顯示了mysql使用索引的長度。當(dāng)key 字段的值為NULL時,索引的長度就是NULL。注意,key_len的值可以告訴你在聯(lián)合索引中MySQL會真正使用了哪些索引。

ref

        表示使用哪個列或常數(shù)與索引一起來查詢記錄。

rows

        顯示MySQL在表中進(jìn)行查詢時必須檢查的行數(shù)。 

Extra

        本字段顯示了查詢中mysql的附加信息。以下是這個字段的幾個不同值的解釋:

distinct MySQL當(dāng)找到當(dāng)前記錄的匹配聯(lián)合結(jié)果的第一條記錄之后,就不再搜索其他記錄了。 not exists MySQL在查詢時做一個LEFT JOIN優(yōu)化時,當(dāng)它在當(dāng)前表中找到了和前一條記錄符合LEFT JOIN條件后,就不再搜索更多的記錄了。下面是一個這種類型的查詢例子: select * from t1 left join t2 on t1.id=t2.id where t2.id is null; 假使 t2.id 定義為 not null。這種情況下,MySQL將會掃描表 t1并且用 t1.id 的值在 t2 中查找記錄。當(dāng)在 t2中找到一條匹配的記錄時,這就意味著 t2.id 肯定不會都是null,就不會再在 t2 中查找相同id值的其他記錄了。也可以這么說,對于 t1 中的每個記錄,mysql只需要在t2 中做一次查找,而不管在 t2 中實際有多少匹配的記錄。 range checked for each record (index map: #) mysql沒找到合適的可用的索引。取代的辦法是,對于前一個表的每一個行連接,它會做一個檢驗以決定該使用哪個索引(如果有的話),并且使用這個索引來從表里取得記錄。這個過程不會很快,但總比沒有任何索引時做表連接來得快。 using filesort MySQL需要額外的做一遍從已排好的順序取得記錄。排序程序根據(jù)連接的類型遍歷所有的記錄,并且將所有符合where條件的記錄的要排序的鍵和指向記錄的指針存儲起來。這些鍵已經(jīng)排完序了,對應(yīng)的記錄也會按照排好的順序取出來。詳情請看"7.2.9how mysql optimizes order by"。 using index 字段的信息直接從索引樹中的信息取得,而不再去掃描實際的記錄。這種策略用于查詢時的字段是一個獨立索引的一部分。 using temporary mysql需要創(chuàng)建臨時表存儲結(jié)果以完成查詢。這種情況通常發(fā)生在查詢時包含了group by和order by子句,它以不同的方式列出了各個字段。 using where where子句將用來限制哪些記錄匹配了下一個表或者發(fā)送給客戶端。除非你特別地想要取得或者檢查表種的所有記錄,否則的話當(dāng)查詢的extra字段值不是using where并且表連接類型是all或index時可能表示有問題。 如果你想要讓查詢盡可能的快,那么就應(yīng)該注意extra字段的值為using filesort和using temporary的情況。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MYSQL語句調(diào)優(yōu):MYSQL Explain 執(zhí)行計劃輸出詳解
MySQL優(yōu)化(二) MySQL 卓越資源
MySQL數(shù)據(jù)庫Query的優(yōu)化
添加mysql索引的3條原則
我的MYSQL學(xué)習(xí)心得(十六) 優(yōu)化
神奇的 SQL 之 MySQL 執(zhí)行計劃 → EXPLAIN,讓我們了解 SQL 的執(zhí)行過程!
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服