濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL EXPLAIN語(yǔ)句的使用示例

MySQL EXPLAIN語(yǔ)句的使用示例

熱門標(biāo)簽:電話外呼系統(tǒng)改號(hào) 曲靖移動(dòng)外呼系統(tǒng)公司 南昌三維地圖標(biāo)注 啥是企業(yè)400電話辦理 怎樣在地圖標(biāo)注銷售區(qū)域 百應(yīng)電話機(jī)器人優(yōu)勢(shì) 地圖標(biāo)注費(fèi)用是多少 外呼系統(tǒng)打電話上限是多少 武漢網(wǎng)絡(luò)外呼系統(tǒng)服務(wù)商

在MySQL優(yōu)化的環(huán)節(jié)上,我們首先需要知道的就是我們當(dāng)前的這句SQL語(yǔ)句在實(shí)際的數(shù)據(jù)庫(kù)中究竟是怎么執(zhí)行的,才能談要如何優(yōu)化它。而在MySQL中,就給我們提供了模擬語(yǔ)句執(zhí)行的一個(gè)非常好用的關(guān)鍵字:EXPLAIN。EXPLAIN可以用來(lái)查看SQL語(yǔ)句的執(zhí)行效果,可以幫助選擇更好的索引和優(yōu)化查詢語(yǔ)句,寫出更好的優(yōu)化語(yǔ)句。因此今天我們就來(lái)講一講這個(gè)關(guān)鍵字的一些基礎(chǔ)的用法與應(yīng)用。

一、使用方法

EXPLAIN的使用方法非常簡(jiǎn)單:

mysql> EXPLAIN SELECT * FROM user;

簡(jiǎn)單來(lái)說,就是在原有的SQL語(yǔ)句前面加上EXPLAIN關(guān)鍵字,或者說是在EXPLAIN關(guān)鍵字后跟這你要檢查的SQL語(yǔ)句。

二、輸出結(jié)果

EXPLAIN語(yǔ)句的輸出結(jié)果才是我們想要的數(shù)據(jù),也是我們分析的重點(diǎn)。
我們先來(lái)看看上面的語(yǔ)句所給到的對(duì)應(yīng)的結(jié)果的形式:

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE  | user | NULL  | ALL | NULL   | NULL | NULL | NULL | 3 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

EXPLAIN語(yǔ)句給到我們的數(shù)據(jù)總共有10列,接下來(lái)我們看一下一些在性能優(yōu)化上有比較重要作用的數(shù)據(jù)列所代表的意思。

1.id

這個(gè)是select查詢的序列號(hào)。

2.select_type

當(dāng)我們的SQL語(yǔ)句是非select語(yǔ)句的時(shí)候(即delete,update...),這個(gè)字段的值就是對(duì)應(yīng)的操作類型(delete,update...)。

mysql> EXPLAIN INSERT INTO user VAULES(2,'ahong','31');

此時(shí)的輸出select_type就是我們對(duì)應(yīng)的INSERT:

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | INSERT  | user | NULL  | ALL | NULL   | NULL | NULL | NULL | NULL |  NULL | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

而當(dāng)SQL語(yǔ)句時(shí)select語(yǔ)句的時(shí)候,他就是對(duì)應(yīng)的一些詳細(xì)的select的類型,可以有如下幾種:

SIMPLE:簡(jiǎn)單SELECT(不使用UNION或子查詢等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句
DEPENDENT UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句,取決于外面的查詢
UNION RESULT:UNION的結(jié)果。
SUBQUERY:子查詢中的第一個(gè)SELECT
DEPENDENT SUBQUERY:子查詢中的第一個(gè)SELECT,取決于外面的查詢
DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)

下面就是一個(gè)最簡(jiǎn)單的SIMPLE查詢的例子:

mysql> EXPLAIN SELECT * FROM user;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE  | user | NULL  | ALL | NULL   | NULL | NULL | NULL | 3 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

3.table

顯示這一步操作所訪問的數(shù)據(jù)是關(guān)于哪一張表的。

4.partitions

顯示表所使用的分區(qū),如果要統(tǒng)計(jì)十年公司訂單的金額,可以把數(shù)據(jù)分為十個(gè)區(qū),每一年代表一個(gè)區(qū)。這樣可以大大的提高查詢效率。

5.type

這是最重要的一列。顯示了連接使用了哪種類別,有無(wú)使用索引。是分析查詢性能的關(guān)鍵。
結(jié)果性能從優(yōu)到差分別有以下的情況:

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

而這幾種情況所代表的意義如下:

  • system、const: 可以將查詢的變量轉(zhuǎn)為常量. 如id=1; id為 主鍵或唯一鍵.
  • eq_ref: 訪問索引,返回某單一行的數(shù)據(jù).(通常在聯(lián)接時(shí)出現(xiàn),查詢使用的索引為主鍵或惟一鍵)
  • ref: 訪問索引,返回某個(gè)值的數(shù)據(jù).(可以返回多行) 通常使用=時(shí)發(fā)生
  • range: 這個(gè)連接類型使用索引返回一個(gè)范圍中的行,比如使用>或查找東西,并且該字段上建有索引時(shí)發(fā)生的情況(注:不一定好于index)
  • index: 以索引的順序進(jìn)行全表掃描,優(yōu)點(diǎn)是不用排序,缺點(diǎn)是還要全表掃描
  • ALL: 全表掃描,應(yīng)該盡量避免_

一般來(lái)說,得保證查詢至少達(dá)到range級(jí)別,最好能達(dá)到ref,否則就可能會(huì)出現(xiàn)性能問題。

6.possible_key

顯示查詢語(yǔ)句有可能會(huì)使用到的索引列。取值可能為一個(gè),多個(gè)或者null。

7.key

key列顯示的是該查詢語(yǔ)句實(shí)際使用的索引列。如為null,則表示沒有使用索引。
展示一下possible_key和key的實(shí)際效果:
下面是一個(gè)在age列上建立索引的數(shù)據(jù)表,我們進(jìn)行以下的查詢

mysql> explain select * from user where age = 1;

會(huì)得到以下的結(jié)果:

+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+
| 1 | SIMPLE  | user | NULL  | ref | age   | age | 5  | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+

8.key_len

顯示的是當(dāng)前的查詢語(yǔ)句所使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好.

9.ref

引用到的上一個(gè)表的列。

10.rows

根據(jù)表的情況和查詢語(yǔ)句的情況,MySQL會(huì)估算出返回最終結(jié)果所必須檢查的行的數(shù)量。該列的值越大查詢效率越差。

11.filtered

一個(gè)百分比的值,和rows 列的值一起使用,可以估計(jì)出查詢執(zhí)行計(jì)劃(QEP)中的前一個(gè)表的結(jié)果集,從而確定join操作的循環(huán)次數(shù)。小表驅(qū)動(dòng)大表,減輕連接的次數(shù)。

12.extra

關(guān)于MySQL如何解析查詢的額外信息,主要有以下幾種:

Extra中包含的值:

  • using index: 只用到索引,可以避免訪問表,性能很高。
  • using where: 使用到where來(lái)過濾數(shù)據(jù), 不是所有的where clause都要顯示using where. 如以=方式訪問索引。
  • using tmporary: 用到臨時(shí)表去處理當(dāng)前的查詢。
  • using filesort: 用到額外的排序,此時(shí)mysql會(huì)根據(jù)聯(lián)接類型瀏覽所有符合條件的記錄,并保存排序關(guān)鍵字和行指針,然后排序關(guān)鍵字并按順序檢索行。(當(dāng)使用order by v1,而沒用到索引時(shí),就會(huì)使用額外的排序)。
  • range checked for eache record(index map:N): 沒有好的索引可以使用。
  • Using index for group-by:__表明可以在索引中找到分組所需的所有數(shù)據(jù),不需要查詢實(shí)際的表。explain select user_id from t_order group by user_id;_

以上就是MySQL EXPLAIN語(yǔ)句的使用示例的詳細(xì)內(nèi)容,更多關(guān)于MySQL EXPLAIN語(yǔ)句的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL查詢語(yǔ)句過程和EXPLAIN語(yǔ)句基本概念及其優(yōu)化
  • mysql開啟慢查詢(EXPLAIN SQL語(yǔ)句使用介紹)
  • mysql explain的用法(使用explain優(yōu)化查詢語(yǔ)句)
  • Mysql調(diào)優(yōu)Explain工具詳解及實(shí)戰(zhàn)演練(推薦)
  • Mysql explain用法與結(jié)果深入分析
  • 詳解mysql中explain的type
  • MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能
  • Mysql深入探索之Explain執(zhí)行計(jì)劃詳析
  • MySQL索引優(yōu)化Explain詳解
  • MYSQL 性能分析器 EXPLAIN 用法實(shí)例分析
  • MySQL中通過EXPLAIN如何分析SQL的執(zhí)行計(jì)劃詳解

標(biāo)簽:甘南 黑河 錦州 滄州 荊州 資陽(yáng) 吉林 隨州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL EXPLAIN語(yǔ)句的使用示例》,本文關(guān)鍵詞  MySQL,EXPLAIN,語(yǔ)句,的,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL EXPLAIN語(yǔ)句的使用示例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL EXPLAIN語(yǔ)句的使用示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    康马县| 井研县| 滦平县| 舒城县| 禄丰县| 湟中县| 石城县| 新泰市| 新化县| 临洮县| 凤山市| 宁安市| 保山市| 长白| 沐川县| 化隆| 乌鲁木齐县| 华宁县| 界首市| 晴隆县| 郎溪县| 东山县| 酉阳| 南华县| 邛崃市| 乌海市| 温州市| 民县| 邢台市| 龙里县| 聊城市| 溆浦县| 南安市| 平湖市| 泾源县| 华容县| 富阳市| 横山县| 平乐县| 玉溪市| 荣昌县|