鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ mysql 執(zhí)行計(jì)劃查看,走索引的一個(gè)疑問(wèn)?

mysql 執(zhí)行計(jì)劃查看,走索引的一個(gè)疑問(wèn)?

先上表結(jié)構(gòu):
CREATE TABLE table (
xxx varchar(20) NOT NULL,
yyy varchar(20) NOT NULL,
zzz datetime NOT NULL,
aaa varchar(10) NOT NULL,
PRIMARY KEY (xxx,yyy,zzz),
KEY base (xxx,yyy)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-------------------------------------------
先看一下表的索引,
執(zhí)行 show index from table

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
table 0 PRIMARY 1 xxx A 1012 NULL NULL BTREE
table 0 PRIMARY 2 yyy A 1012 NULL NULL BTREE
table 0 PRIMARY 3 zzz A 11134 NULL NULL BTREE
table 1 base 1 xxx A 1012 NULL NULL BTREE
table 1 base 2 yyy A 1012 NULL NULL BTREE

-------------------------------------------

問(wèn)題來(lái)了:

explain select xxx from table where zzz='2017-12-22 00:00:00'

執(zhí)行計(jì)劃如下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE quote_kline_1day index NULL base 164 NULL 11123 Using where; Using index

為什么用了base這個(gè)索引,base是xxx和yyy的聯(lián)合非聚集索引,我where條件是zzz,為什么會(huì)走base索引呢?

------------------華麗的分割線----------------------

explain select xxx from table where xxx='whatever'

執(zhí)行計(jì)劃如下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE quote_kline_1day ref PRIMARY,base PRIMARY 82 const 29 Using where; Using index

為什么這里的extra會(huì)有using where,應(yīng)該是只有using index才對(duì)啊,因?yàn)閣here條件是xxx,是聯(lián)合聚集索引的前導(dǎo)列,而且select的是xxx,應(yīng)該是索引覆蓋的,不需要回表的

回答
編輯回答
伴謊
  1. where條件是zzz,select的字段只有xxx,如果表數(shù)量不大,使用base索引的全掃描可能效率最高。
  2. Using where; Using index的意思是使用了索引覆蓋,但需要根據(jù)where條件對(duì)索引進(jìn)行過(guò)濾,但仍不需要回表查詢數(shù)據(jù)。
2017年7月30日 13:45
編輯回答
還吻

using where并不是說(shuō)就一定要回表的,只是一個(gè)過(guò)濾而已,索引文件里面篩選也算,并且執(zhí)行計(jì)劃也不是絕對(duì)就按這個(gè)執(zhí)行的,很多時(shí)候表數(shù)據(jù)分布不同,統(tǒng)計(jì)信息發(fā)生變化都會(huì)影響執(zhí)行計(jì)劃的生成,執(zhí)行計(jì)劃只是提供參考,不必這么糾結(jié)。

2018年6月8日 19:15