日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

mysql 多key索引_MYSQL的EXPLAIN到底多好用?

發(fā)布時(shí)間:2025/6/15 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 多key索引_MYSQL的EXPLAIN到底多好用? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工欲善其事必先利其器!

作為一名程序員,免不了要和MYSQL打交道。而在這過程中,就不得不面對性能優(yōu)化這一大課題。

而在性能優(yōu)化中,EXPLAIN就是能夠幫助我們查看SQL執(zhí)行計(jì)劃是否優(yōu)化的一個(gè)工具。

今天,我們就基于一個(gè)案例來看看EXPLAIN的神奇作用。

一、具體案例

我們來執(zhí)行一條非常簡單的代碼:

expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;

執(zhí)行之后的結(jié)果如下:

發(fā)現(xiàn)出來了很多的字段,這么多字段其實(shí)也沒必要每個(gè)都重點(diǎn)關(guān)注,上面圖片用紅色框框標(biāo)出了5個(gè)字段,這些是需要重點(diǎn)關(guān)注的。下面具體來說說這5個(gè)字段的含義。

1.type

表示訪問表的方式,一共有6種。

從最好到最差的結(jié)果依次如下:

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

注意:一個(gè)好的SQL語句至少要達(dá)到range級別!杜絕出現(xiàn)all級別。

system: 表示結(jié)果集僅有一行;

const: 表示通過主鍵或者唯一鍵查找數(shù)據(jù)時(shí)只匹配最多一行數(shù)據(jù);

eq_ref: 該類型多出現(xiàn)在多表join場景,通過主鍵或者唯一鍵訪問表;

對于前表b的每行記錄,都只能匹配到后表a的一行記錄并且查詢的比較操作通常是=,查詢效率較高。

ref: 此類型通常出現(xiàn)在sql使用非唯一或非主鍵索引, 或者是使用最左前綴規(guī)則索引的查詢;

range: 表示where條件使用索引范圍查詢,當(dāng) type 是 range 時(shí),ref 字段為 NULL。

index: 表示全索引掃描, 掃描所有的索引記錄, 而不掃描數(shù)據(jù);

index 類型通常會出現(xiàn)在覆蓋索引中,所要查詢的數(shù)據(jù)直接在索引中就可以訪問, 而不用回表掃描數(shù)據(jù)。 此時(shí)Extra 字段 會顯示 Using index。還有一種是全表掃描時(shí)通過索引順序訪問數(shù)據(jù)。此時(shí)并不會在Extra提示 using index。

ALL: 表示執(zhí)行計(jì)劃選擇全表掃描,當(dāng)執(zhí)行計(jì)劃出現(xiàn)type 為all 時(shí),我們盡量通過修改索引的方式讓查詢利用索引。

2.key

此字段是 MySQL 在當(dāng)前查詢時(shí)所使用到的索引。

如果沒有選擇索引,值是NULL。

可以采取強(qiáng)制索引方式。

3.key_len

key_len表示執(zhí)行計(jì)劃所選擇的索引長度有多少字節(jié),通常我們可借此判斷聯(lián)合索引有多少列。

key_len 大小的計(jì)算規(guī)則是:

一般地,key_len 等于索引列類型字節(jié)長度,例如int類型為4 bytes,bigint為8 bytes;如果是字符串類型,還需要同時(shí)考慮字符集因素,例如:CHAR(30) UTF8則key_len至少是90 bytes;若該列類型定義時(shí)允許NULL,其key_len還需要再加 1 bytes;若該列類型為變長類型,例如 VARCHAR(TEXT\BLOB不允許整列創(chuàng)建索引,如果創(chuàng)建部分索引也被視為動態(tài)列類型),其key_len還需要再加 2 bytes。

4.rows

表示的是掃描行數(shù)。

記住:該值是個(gè)預(yù)估值,所以并非是完全準(zhǔn)確的值。

MySQL 查詢優(yōu)化器根據(jù)統(tǒng)計(jì)信息,估算 SQL 要查找到結(jié)果集需要掃描讀取的數(shù)據(jù)行數(shù)。

原則上 rows 越少越好。

5.extra

該列會提示優(yōu)化執(zhí)行計(jì)劃的額外的信息。

注意,常見的不太友好的、值得大家關(guān)注的有如下幾種:

Using index。表示該sql利用覆蓋索引掃描,也即從只訪問索引即可獲取到所需的數(shù)據(jù),而不用回表。

Using where。表示該sql 回表獲取數(shù)據(jù)了。什么是回表呢? 其實(shí)就是僅僅通過訪問索引不能滿足獲取所需的數(shù)據(jù),需要訪問表的page 頁。

如果和Using index 同時(shí)出現(xiàn),說明where條件通過索引定位數(shù)據(jù),然后回表,再過濾所需要的數(shù)據(jù)。

Using filesort。說明排序沒有利用索引而發(fā)生了額外排序 ,伴隨著的可能還有Using temporary。

其實(shí)還有其他一些 提示Using MRR、Using index condition 、Using index for group-by,這些提示是正向的,說明sql比較優(yōu)化。

6.其它字段

前面講了5個(gè)比較重要的字段,相信很多求知欲強(qiáng)的小伙伴也想知道其它字段是什么意思,這里也一并列出來,以供參考:

字段

含義

查詢語句的序號或者說是標(biāo)識符

select_type

表是查詢的類型,常見的有如下6種

table

其值為表名或者表的別名,表示訪問哪一個(gè)表

partitions

匹配的分區(qū)

possible_keys

表示查詢時(shí),可能使用的索引

filtered

按表?xiàng)l件過濾的行百分比

二、總結(jié)

本文基于一個(gè)最為簡單的案例講解了explain的執(zhí)行結(jié)果,最為重要的是5個(gè)字段,其它字段了解含義即可,希望對您有用~

總結(jié)

以上是生活随笔為你收集整理的mysql 多key索引_MYSQL的EXPLAIN到底多好用?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。