MySQL数据库性能优化(2) (12)

不使用任何查询条件

explain select * from myuser; +----+-------------+-------+------+---------------+-----+---------+-----+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+-----+---------+-----+------+-------+ | 1 | SIMPLE | myuser| ALL | | | | | 13 | | +----+-------------+-------+------+---------------+-----+---------+-----+------+-------+ # 检索数据表中的所有记录,由于没有使用任何检索条件,所以InnoDB引擎从聚簇索引上扫描出所有的数据行

使用非唯一建索引作为查询条件

explain select * from myuser where user_name = \'用户1\'; # 省去了表头,因为不好排版(可以参考上一个示例的表头) ...... |1 | SIMPLE | myuser | ref |name_index|name_index | 767 | const | 6 | Using index condition | # InnoDB引擎首先从非聚簇索引上查找满足条件的多个索引项,然后在聚簇索引上找到具体的数据

直接使用主键作为查询条件

explain select * from myuser where id = 1; # 省去了表头,因为不好排版(可以参考上上一个示例的表头) ...... | 1 | SIMPLE | myuser | const | PRIMARY | PRIMARY | 4 | const | 1 | --这列没有信息-- | #使用聚簇索引直接定位数据

使用非索引字段作为查询条件

explain select * from myuser where usersex = 1 +----+-------------+-------+------+---------------+-----+---------+-----+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+-----+---------+-----+------+-------------+ | 1 | SIMPLE | myuser| ALL | | | | | 13 | Using where | +----+-------------+-------+------+---------------+-----+---------+-----+------+-------------+ # 由于没有创建索引,所以在聚簇索引上进行全表扫秒,并且过滤出满足条件的信息。

5-1-2、执行计划结果项

虽然本文还没有针对以上执行计划示例的分析结果进行讲解,但是为了让各位读者能够无阻碍的看下去,本文需要首先说明一下执行计划中的各个结果项的基本含义。在以上的示例中我们使用的MySQL的版本为MySQL version 5.6,根据不同的数据库版本,执行计划的分析结果可能会有一些不同。

# 以下是MySQL 5.6版本的执行计划的分析结果的表头 +----+-------------+-------+------+---------------+-----+---------+-----+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+-----+---------+-----+------+-------+

以上表头的各个字段项目的大致意义如下:

id:每个被独立执行的操作的标识,表示对象被操作的顺序;ID值大,先被执行;如果相同,执行顺序一般从上到下。

select_type: 数据库引擎将SQL拆分成若***分的子查询/子操作,每个查询select子句中的查询类型(后文详细讲解)。

table: 本次子查询所查询的目标数据表。SQL查询语句即使再复杂,一次子查询也只可能最多关联一张数据表。

partitions: 本次查询所涉及的数据表目标分区信息(如果有分区的话)。后文将对分区的概念进行概要说明。

type: 子查询类型,非常重要的性能衡量点。这个字段项可能显示的值包括:“ALL->index->range->ref->eq_ref->const | system->NULL”这些值所表示的查询性能,从左至右依次增加(注意,按照数据库基本思想——B+树,查询性能可能呈几何级的变化也可能差异不大)。这些值所代表的查询动作,在后文中会详细进行介绍。

possible_keys: 本次子查询可能使用的索引(前提是,您要建立了索引)。如果查询所使用的检索条件可能涉及到多个索引,这里将会列出这些所有的可能性。

key: 本次子查询最终被选定的执行索引。有的时候possible_keys可能有值,但keys可能没有,这就代表InnoDB引擎最终并没有使用任何索引作为检所依据。

key_len: 被选定的索引键的长度。

ref: 表示本次子查询参照的参照条件/参照数据表,参照条件/参照数据表,这个字段的值还可能是一个常量。

rows: 执行根据目前数据表的实际情况预估的,完成这个子查询需要扫描的数据行数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgffsf.html