澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

MySQL 性能优化神器 Explain 使用分析

澳门大富豪网站平台 1

转载 https://segmentfault.com/a/1190000008131735

目录相同大学教室建书目索引,能够增加数据检索的频率,收缩数据库的IO开销。MySQL在300万条记下左右个性起初逐步下落,固然合法文书档案说500~800w记录,所以大数据量创立目录是老大有无法缺乏的。MySQL提供了Explain,用于呈现SQL试行的详细音讯,能够张开索引的优化。

简介
MySQL 提供了三个 EXPLAIN 命令, 它能够对 SELECT 语句进行解析, 并输出 SELECT 实行的详细音信, 以供开垦人士针对性优化.
EXPLAIN 命令用法非常轻巧易行, 在 SELECT 语句前拉长 Explain 就能够了, 举例:
EXPLAIN SELECT * from user_info WHERE id < 300;
准备
为了接下来方便演示 EXPLAIN 的行使, 首先我们必要树立三个测验用的表, 并增添相应的多少:
CREATE TABLE user_info (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL DEFAULT '',
age INT(11) DEFAULT NULL,
PRIMARY KEY (id),
KEY name_index (name)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8

 

INSERT INTO user_info (name, age) VALUES ('xys', 20);
INSERT INTO user_info (name, age) VALUES ('a', 21);
INSERT INTO user_info (name, age) VALUES ('b', 23);
INSERT INTO user_info (name, age) VALUES ('c', 50);
INSERT INTO user_info (name, age) VALUES ('d', 15);
INSERT INTO user_info (name, age) VALUES ('e', 20);
INSERT INTO user_info (name, age) VALUES ('f', 21);
INSERT INTO user_info (name, age) VALUES ('g', 23);
INSERT INTO user_info (name, age) VALUES ('h', 50);
INSERT INTO user_info (name, age) VALUES ('i', 15);
CREATE TABLE order_info (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
user_id BIGINT(20) DEFAULT NULL,
product_name VARCHAR(50) NOT NULL DEFAULT '',
productor VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (id),
KEY user_product_detail_index (user_id, product_name, productor)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8

意气风发、诱致SQL施行慢的案由

 

1.硬件难题。如网络速度慢,内部存款和储蓄器不足,I/O吞吐量小,磁盘空间满了等。

 

2.不曾索引也许索引失效。(常常在网络公司,DBA会在半夜三更把表锁了,重新树立叁次索引,因为当您剔除有个别数据的时候,索引的树构培养破损了。所以网络集团的数量做的是假删除.一是为了做多少剖析,二是为着不破坏索引 )

 

3.数目过多(分库分表)

 

4.服务器调优及顺序参数设置(调节my.cnf)

 

INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p2', 'WL');
INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'DX');
INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p5', 'WL');
INSERT INTO order_info (user_id, product_name, productor) VALUES (3, 'p3', 'MA');
INSERT INTO order_info (user_id, product_name, productor) VALUES (4, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (6, 'p1', 'WHH');
INSERT INTO order_info (user_id, product_name, productor) VALUES (9, 'p8', 'TE');
EXPLAIN 输出格式
EXPLAIN 命令的出口内容大致如下:
mysql> explain select * from user_info where id = 2G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
各列的含义如下:
id: SELECT 查询的标志符. 种种 SELECT 都会自动分配一个唯少年老成的标记符.
select_type: SELECT 查询的类型.
table: 查询的是哪些表
partitions: 相配的分区
type: join 类型
possible_keys: 此番查询中大概选拔的目录
key: 本次查询中恰恰使用到的索引.
ref: 哪个字段或常数与 key 一齐被应用
rows: 展现此询问朝气蓬勃共扫描了多少行. 这么些是五个猜想值.
filtered: 表示此询问条件所过滤的数指标比重
extra: 额外的音讯
接下去大家来根本看一下超重大的多少个字段.
select_type
select_type 代表了询问的项目, 它的常用取值有:
SIMPLE, 表示此询问不带有 UNION 查询或子查询
MySQL 性能优化神器 Explain 使用分析。P冠道IMA安德拉Y, 表示此询问是最外层的查询
UNION, 表示此询问是 UNION 的第二或随后的查询
DEPENDENT UNION, UNION 中的第3个或后边的询问语句, 决意于外面包车型客车询问
UNION RESULT, UNION 的结果
SUBQUETiggoY, 子查询中的第一个 SELECT
DEPENDENT SUBQUEHighlanderY: 子查询中的第多少个 SELECT, 决议于外面的查询. 即子查询注重于外层查询的结果.
最广大的查询连串应该是 SIMPLE 了, 举个例子当我们的询问未有子查询, 也从不 UNION 查询时, 那么普通便是 SIMPLE 类型, 比方:
mysql> explain select * from user_info where id = 2G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
设若大家使用了 UNION 查询, 那么 EXPLAIN 输出 的结果相像如下:
mysql> EXPLAIN (SELECT * FROM user_info WHERE id IN (1, 2, 3))
-> UNION
-> (SELECT * FROM user_info WHERE id IN (3, 4, 5));
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
| 1 | PRIMARY | user_info | NULL | range | PRIMARY | PRIMARY | 8 | NULL | 3 | 100.00 | Using where |
| 2 | UNION | user_info | NULL | range | PRIMARY | PRIMARY | 8 | NULL | 3 | 100.00 | Using where |
| NULL | UNION RESULT | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+
3 rows in set, 1 warning (0.00 sec)
table
表示查询涉及的表或衍生表
type
type 字段超级重大, 它提供了推断查询是或不是急迅的主要依附依靠. 通过 type 字段, 我们判别此番查询是 全表扫描 依旧 索引扫描 等.
type 常用场目

二、解析原因时,应当要找切入点

 

1.先观望,开启慢查询日志,设置相应的阈值(比如超过3秒正是慢SQL),在生养碰着跑上个一天过后,看看怎么着SQL一点也不慢。

 

2.Explain和慢SQL深入分析。譬如SQL语句写的烂,索引未有或失效,关联查询太多(有时候是设计破绽可能不得以的供给)等等。

 

3.Show Profile是比Explain更近一步的实践细节,能够查询到履行每三个SQL都干了哪些事,那一个事分别花了不怎么秒。

 

4.找DBA可能运营对MySQL进行服务器的参数调优。

 

type 常用的取值有:
system: 表中独有一条数据. 那一个项目是特殊的 const 类型.
const: 针对主键或独一索引的等值查询扫描, 最六只回去大器晚成行数据. const 查询速度相当慢, 因为它独自读取三遍就可以.
举个例子上边包车型客车那么些查询, 它利用了主键索引, 由此 type 正是 const 类型的.
mysql> explain select * from user_info where id = 2G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
eq_ref: 此类型经常现身在多表的 join 查询, 表示对早先表的每一个结出, 都只好同盟到后表的风流倜傥行结果. 而且询问的可比操作平时是 =, 查询功用较高. 举个例子:
mysql> EXPLAIN SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_idG
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: order_info
partitions: NULL
type: index
possible_keys: user_product_detail_index
key: user_product_detail_index
key_len: 314
ref: NULL
rows: 9
filtered: 100.00
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: test.order_info.user_id
rows: 1
filtered: 100.00
Extra: NULL
2 rows in set, 1 warning (0.00 sec)
ref: 此类型平时出以往多表的 join 查询, 针对于非唯风姿洒脱或非主键索引, 大概是选拔了 最左前缀 法规索引的查询.
比如下边那几个事例中, 就利用到了 ref 类型的查询:
mysql> EXPLAIN SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id AND order_info.user_id = 5G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
filtered: 100.00
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: order_info
partitions: NULL
type: ref
possible_keys: user_product_detail_index
key: user_product_detail_index
key_len: 9
ref: const
rows: 1
filtered: 100.00
Extra: Using index
2 rows in set, 1 warning (0.01 sec)
range: 表示使用索引范围查询, 通过索引字段范围获得表中部分数码记录. 那么些项目平常出今后 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN(卡塔尔(英语:State of Qatar) 操作中.
当 type 是 range 时, 那么 EXPLAIN 输出的 ref 字段为 NULL, 并且 key_len 字段是本次查询中选用到的目录的最长的那二个.
比如下边的事例正是叁个约束查询:
mysql> EXPLAIN SELECT *
-> FROM user_info
-> WHERE id BETWEEN 2 AND 8 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: NULL
rows: 7
filtered: 100.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
index: 表示全索引围观(full index scan卡塔尔(قطر‎, 和 ALL 类型相近, 只可是 ALL 类型是全表扫描, 而 index 类型则单纯扫描全部的目录, 而不扫描数据.
index 类型日常出今后: 所要查询的数码间接在索引树中就足以拿到到, 而无需扫描数据. 当是这种情形时, Extra 字段 会展现 Using index.
例如:
mysql> EXPLAIN SELECT name FROM user_info G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: index
possible_keys: NULL
key: name_index
key_len: 152
ref: NULL
rows: 10
filtered: 100.00
Extra: Using index
1 row in set, 1 warning (0.00 sec)
上边的事例中, 大家查询的 name 字段恰巧是叁个索引, 因而大家一贯从索引中获取数据就可以满足查询的要求了, 而没有必要查询表中的数据. 由此那样的状态下, type 的值是 index, 而且 Extra 的值是 Using index.
ALL: 表示全表扫描, 这几个类别的查询是性质最差的查询之大器晚成. 平常来讲, 大家的询问不应该现身 ALL 类型的查询, 因为如此的查询在数据量大的情事下, 对数据库的品质是伟大的患难. 如八个查询是 ALL 类型查询, 那么日常的话能够对相应的字段增添索引来幸免.
下面是多少个全表扫描的例证, 能够看看, 在全表扫描时, possible_keys 和 key 字段都是 NULL, 表示并未有运用到目录, 何况 rows 十二分宏大, 由此全数查询作用是十分下垂的.
mysql> EXPLAIN SELECT age FROM user_info WHERE age = 20 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_info
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10
filtered: 10.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
type 类型的本性相比

三、什么是索引?

 

MySQL官方对索引的概念为:索引(Index卡塔尔国是扶持MySQL高效获取数据的数据结构。大家能够省略明白为:飞速寻觅排好序的黄金时代种数据布局。Mysql索引主要有三种构造:B+Tree索引和Hash索引。我们平常所说的目录,若无特意指明,日常都以指B树构造协会的目录(B+Tree索引卡塔尔(英语:State of Qatar)。索引如图所示:

 

澳门大富豪网站平台 2

 

最外层深红白磁盘块1里有多少17、35(中湖蓝色)和指针P1、P2、P3(浅鹅黄)。P1指针表示小于17的磁盘块,P2是在17-35中间,P3指向超越35的磁盘块。真实数据存在于子叶节点也便是最下边包车型客车意气风发层3、5、9、10、13……非叶子节点不存款和储蓄真实的数据,只存款和储蓄教导搜索方向的数量项,如17、35。

 

寻觅进程:举例寻觅28数额项,首先加载磁盘块1到内部存款和储蓄器中,发生叁回I/O,用二分查找明确在P2指针。接着发掘28在26和30时期,通过P2指针之处加载磁盘块3到内部存款和储蓄器,发生第二次I/O。用同生机勃勃的点子找到磁盘块8,产生第三回I/O。

 

实在的景色是,上边3层的B+Tree能够表示上百万的数据,上百万的数量只产生了叁次I/O并非上百万次I/O,时间升高是了不起的。

 

平时来讲, 不相同的 type 类型的习性关系如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system
ALL 类型因为是全表扫描, 因而在相仿的询问条件下, 它是速度最慢的.
而 index 类型的询问即使不是全表扫描, 不过它扫描了有着的目录, 因而比 ALL 类型的稍快.
后边的二种档期的顺序皆以行使了索引来查询数据, 因而能够过滤部分或领前后相继生可畏一半目, 由此查询成效就比较高了.
possible_keys
possible_keys 代表 MySQL 在询问时, 能够使用到的索引. 注意, 即便稍稍索引在 possible_keys 中现身, 可是并不表示此索引会真正地被 MySQL 使用到. MySQL 在查询时具体运用了怎样索引, 由 key 字段决定.
key
此字段是 MySQL 在这里时此刻查询时所真正使用到的索引.
key_len
意味着查询优化器使用了目录的字节数. 那些字段能够评估组合索引是还是不是完全被运用, 或只有最左部分字段被选拔到.
key_len 的计量准则如下:

四、Explain 分析

 

前文铺垫完结,步向实际操作部分,先来插入测量试验须求的数量:

 

CREATE TABLE `user_info` (

  `id`   BIGINT(20)  NOT NULL AUTO_INCREMENT,

  `name` VARCHAR(50) NOT NULL DEFAULT '',

  `age`  INT(11)              DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `name_index` (`name`)

)ENGINE = InnoDB DEFAULT CHARSET = utf8;

 

INSERT INTO user_info (name, age) VALUES ('xys', 20);

INSERT INTO user_info (name, age) VALUES ('a', 21);

INSERT INTO user_info (name, age) VALUES ('b', 23);

INSERT INTO user_info (name, age) VALUES ('c', 50);

INSERT INTO user_info (name, age) VALUES ('d', 15);

INSERT INTO user_info (name, age) VALUES ('e', 20);

INSERT INTO user_info (name, age) VALUES ('f', 21);

INSERT INTO user_info (name, age) VALUES ('g', 23);

INSERT INTO user_info (name, age) VALUES ('h', 50);

INSERT INTO user_info (name, age) VALUES ('i', 15);

 

CREATE TABLE `order_info` (

  `id`           BIGINT(20)  NOT NULL AUTO_INCREMENT,

  `user_id`      BIGINT(20)           DEFAULT NULL,

  `product_name` VARCHAR(50) NOT NULL DEFAULT '',

  `productor`    VARCHAR(30)          DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)

)ENGINE = InnoDB DEFAULT CHARSET = utf8;

 

INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'WHH');

INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p2', 'WL');

INSERT INTO order_info (user_id, product_name, productor) VALUES (1, 'p1', 'DX');

INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p1', 'WHH');

INSERT INTO order_info (user_id, product_name, productor) VALUES (2, 'p5', 'WL');

INSERT INTO order_info (user_id, product_name, productor) VALUES (3, 'p3', 'MA');

INSERT INTO order_info (user_id, product_name, productor) VALUES (4, 'p1', 'WHH');

INSERT INTO order_info (user_id, product_name, productor) VALUES (6, 'p1', 'WHH');

INSERT INTO order_info (user_id, product_name, productor) VALUES (9, 'p8', 'TE');

 

初体验,执行Explain的效果:

 

澳门大富豪网站平台 3

 

目录使用状态在possible_keys、key和key_len三列,接下去大家先从左到右依次批注。

 

字符串
char(n卡塔尔国: n 字节长度
varchar(n): 如果是 utf8 编码, 则是 3 n + 2字节; 如果是 utf8mb4 编码, 则是 4 n + 2 字节.

1.id

 

--id相似,实行各种由上而下

explain select u.*,o.* from user_info u,order_info o where u.id=o.user_id;

 

澳门大富豪网站平台 4

 

--id区别,值越大越先被实践

explain select * from  user_info  where id=(select user_id from order_info where  product_name ='p8');

 

澳门大富豪网站平台 5

数值类型:
TINYINT: 1字节
SMALLINT: 2字节
MEDIUMINT: 3字节
INT: 4字节
BIGINT: 8字节

 

光阴等级次序
DATE: 3字节
TIMESTAMP: 4字节
DATETIME: 8字节
字段属性: NULL 属性 占用一个字节. 假若贰个字段是 NOT NULL 的, 则未有此属性.
大家来举四个轻松的栗子:
mysql> EXPLAIN SELECT * FROM order_info WHERE user_id < 3 AND product_name = 'p1' AND productor = 'WHH' G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: order_info
partitions: NULL
type: range
possible_keys: user_product_detail_index
key: user_product_detail_index
key_len: 9
ref: NULL
rows: 5
filtered: 11.11
Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)
地点的事例是从表 order_info 中查询钦命的内容, 而大家从此现在表的建表语句中得以精晓, 表 order_info 有一个联合索引:
KEY user_product_detail_index (user_id, product_name, productor)
唯独此查询语句 WHERE user_id < 3 AND product_name = 'p1' AND productor = 'WHH' 中, 因为先实行 user_id 的界定查询, 而根据最左前缀相配 原则, 当遭遇范围查询时, 就终止索引的合营, 因而实际大家采纳到的目录的字段唯有 user_id, 因此在 EXPLAIN 中, 显示的 key_len 为 9. 因为 user_id 字段是 BIGINT, 占用 8 字节, 而 NULL 属性占用一个字节, 因此总共是 9 个字节. 若大家将user_id 字段改为 BIGINT(20卡塔尔(英语:State of Qatar) NOT NULL DEFAULT '0', 则 key_length 应该是8.
下面因为 最左前缀相配 原则, 大家的询问仅仅使用到了二只索引的 user_id 字段, 因而效能不算高.
接下去大家来看一下下二个事例:
mysql> EXPLAIN SELECT * FROM order_info WHERE user_id = 1 AND product_name = 'p1' G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: order_info
partitions: NULL
type: ref
possible_keys: user_product_detail_index
key: user_product_detail_index
key_len: 161
ref: const,const
rows: 2
filtered: 100.00
澳门大富豪网站平台,Extra: Using index
1 row in set, 1 warning (0.00 sec)
本次的查询中, 大家从不选拔到范围查询, key_len 的值为 161. 为何吗? 因为我们的询问条件 WHERE user_id = 1 AND product_name = 'p1' 中, 仅仅使用到了联合索引中的前四个字段, 由此 keyLen(user_id) + keyLen(product_name) = 9 + 50 * 3 + 2 = 161
rows
rows 也是三个重中之重的字段. MySQL 查询优化器依照计算新闻, 测度 SQL 要查找到结果集必要扫描读取的数目行数.
这一个值非常直观呈现 SQL 的效能好坏, 原则上 rows 越少越好.
Extra
Explain 中的相当多十三分的音信会在 Extra 字段展现, 管见所及的有以下两种内容:
Using filesort
当 Extra 中有 Using filesort 时, 表示 MySQL 需附加的排序操作, 无法通过索引顺序达到排序效果. 常常常有 Using filesort, 都提出优化去掉, 因为那样的询问 CPU 能源消耗大.
比方上边包车型地铁例子:
mysql> EXPLAIN SELECT * FROM order_info ORDER BY product_name G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: order_info
partitions: NULL
type: index
possible_keys: NULL
key: user_product_detail_index
key_len: 253
ref: NULL
rows: 9
filtered: 100.00
Extra: Using index; Using filesort
1 row in set, 1 warning (0.00 sec)
咱俩的目录是
KEY user_product_detail_index (user_id, product_name, productor)
但是地点的查询中依据 product_name 来排序, 因而无法应用索引进行优化, 进而会发出 Using filesort.
万豆蔻年华大家将排序依附改为 OOdysseyDEPRADO BY user_id, product_name, 那么就不会出现Using filesort 了. 举个例子:
mysql> EXPLAIN SELECT * FROM order_info ORDER BY user_id, product_name G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
澳门网上赌搏平台,table: order_info
partitions: NULL
type: index
possible_keys: NULL
key: user_product_detail_index
key_len: 253
ref: NULL
rows: 9
filtered: 100.00
Extra: Using index
1 row in set, 1 warning (0.00 sec)
Using index
"覆盖索引围观", 表示查询在索引树中就可寻觅所需数据, 不用扫描表数据文件, 往往表达质量不错
Using temporary
查询有应用有的时候表, 日常现身于排序, 分组和多表 join 的事态, 查询功效不高, 建议优化.

2.select_type

 

能够看id的施行实例,总共有以下三种档期的顺序:

 

  • SIMPLE: 表示此询问不带有 UNION 查询或子查询

  • PGL450IMACR-VY: 表示此询问是最外层的询问

  • SUBQUE奇骏Y: 子查询中的第一个 SELECT

  • UNION: 表示此询问是 UNION 的第二或随后的询问

  • DEPENDENT UNION: UNION 中的第三个或前边的查询语句, 决定于外面包车型大巴查询

  • UNION RESULT, UNION 的结果

  • DEPENDENT SUBQUEOdysseyY: 子查询中的第一个 SELECT, 决定于外面的查询. 即子查询信任于外层查询的结果.

  • DELANDIVED:衍生,表示导出表的SELECT(FROM子句的子查询)

 

3.table

 

table表示查询涉及的表或衍生的表:

 

explain select tt.* from (select u.* from user_info u,order_info o where u.id=o.user_id and u.id=1) tt

 

澳门大富豪网站平台 6

 

id为1的<derived2>的意味id为2的u和o表衍生出来的。

 

4.type

 

type 字段相比较重要,它提供了决断查询是不是快速的主要依附依赖。 通过 type 字段,大家看清这次查询是 全表扫描 照旧 索引围观等。

 

澳门大富豪网站平台 7
type 常用的取值有:

 

  • system: 表中唯有一条数据, 那几个种类是改头换面的 const 类型。

  • const: 针对主键或独一索引的等值查询扫描,最四只回去风姿浪漫行数据。 const 查询速度相当的慢, 因为它可是读取三回就能够。举个例子上面的那几个查询,它采纳了主键索引,由此type 就是 const 类型的:explain select * from user_info where id = 2;

  • eq_ref: 此类型平常出现在多表的 join 查询,表示对于前表的每一个结实,都必须要合作到后表的豆蔻梢头行结果。何况询问的相比操作平时是 =,查询效用较高。举个例子:explain select * from user_info, order_info where user_info.id = order_info.user_id;

  • ref: 此类型日常出以后多表的 join 查询,针对于非唯豆蔻梢头或非主键索引,只怕是行使了 最左前缀 准则索引的查询。举例上面那一个例子中, 就选用到了 ref 类型的查询:explain select * from user_info, order_info where user_info.id = order_info.user_id AND order_info.user_id = 5

  • range: 表示使用索引范围查询,通过索引字段范围获得表中一些数据记录。这几个类别日常出今后=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN(卡塔尔(قطر‎ 操作中。比如下边包车型地铁事例就是一个限量查询:explain select * from user_info  where id between 2 and 8;

  • index: 表示全索引围观(full index scan卡塔尔(英语:State of Qatar),和 ALL 类型相仿,只然则 ALL 类型是全表扫描,而 index 类型则仅仅扫描全部的目录, 而不扫描数据。index 类型平日出以后:所要查询的数码直接在索引树中就能够拿走到, 而无需扫描数据。当是这种意况时,Extra 字段 会显示 Using index。

  • ALL: 表示全表扫描,那么些类别的查询是性质最差的查询之生龙活虎。平常来讲, 我们的询问不应有现身 ALL 类型的查询,因为如此的询问在数据量大的情况下,对数据库的天性是石破惊天的不幸。 如一个查询是 ALL 类型查询, 那么日常的话能够对相应的字段加多索引来防止。

 

平时来讲, 分裂的 type 类型的性质关系如下:

ALL < index < range ~ index_merge < ref < eq_ref < const < system

ALL 类型因为是全表扫描, 因而在相似的查询条件下,它是速度最慢的。而 index 类型的询问即便不是全表扫描,可是它扫描了具有的目录,因而比 ALL 类型的稍快.前面包车型大巴二种档次都以接受了索引来查询数据,由此得以过滤部分或大部数据,由此查询功用就比较高了。

 

本文由澳门网络娱乐游戏平台发布于数据库,转载请注明出处:MySQL 性能优化神器 Explain 使用分析

相关阅读