我刚开始看执行计划的时候,还以为是mysql计划如何去执行对数据库的增删改查,类似于触发器之类的东西,但经过学习才发现执行计划真的是跟触发器一毛钱关系都没有。
什么时执行计划
什么是执行计划呢?我个人理解,执行计划是告诉数据库操作人员这条sql语句将要如何去查询。说白了,如果说sql语句是具体的执行行动,那么执行计划就是行动的预算,比如说执行的时候会不会用到索引,会不会用到分区等。
我们先创建一张表:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` bit(1) DEFAULT b'0',
PRIMARY KEY (`id`)
)
我们执行一条语句:
select * from student where name="abc";
如何查看执行计划呢,很简单,在执行的sql语句之前加上“desc”或“explain”即可。我们具体查看下:
desc select * from student where name="abc" \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 7
filtered: 14.29
Extra: Using where
各个字段的含义:
id:查询序列号,select的识别符
select_type:表示这条查询语句的类型,因为这条查询语句只涉及到了一个表:student,它在执行查询的过程既没有跟别的表一起进行联合查询,也没有进行子查询所以它的类型最后确定成SIMPLE
table:查询的表,就是在查询过程中要涉及到的表,本表只有student因此没什么好说的。
partitions:分区,就是说这个表如果进行了分区存储的话,这个个查询最后会落到哪个分区之中。因为student表并没有进行任何的分区处理,所以返回null
type:表示在进行查询的时候查询的类型,怎么理解呢?我认为查询的类型是根据查询的范围分的,如果需要进行全表扫描,那么type就是ALL,而如果对表进行了分区,那么肯定就就是range了。
possible_keys:表示执行sql语句所查询到的行如果使用其它的select语句进行查询,可能使用到的索引值。
key:在查询过程中实际使用到的索引。
key_len:表示mysql选择的索引字段按字节计算的长度。
ref:表示使用哪个列与索引一起做查询记录。
row:表示在表中进行查询的时候必须(注意是必须)检查的行数。
filtered:通过查询条件过滤的查询记录数在整张表中记录数的比例。
Extra:在查询过程中的详细信息。
最后,如果在name字段上加上索引,会造成执行计划的变化,我们也可以通过两个执行计划的不同来加深对以上的字段的理解:
alter table student add index idx_name (name);
desc select * from student where name = "abc" \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ref
possible_keys: idx_name
key: idx_name
key_len: 23
ref: const
rows: 1
filtered: 100.00
Extra: NULL
由此也可以看出索引在查询过程中所起的作用和所占的分量