开始想理理我学会的关于mysql的使用,当发现一个sql执行比较慢的时候,而后就要分析这条sql的执行计划是怎么样的,包括表如何链接和链接的顺序,那么在mysql中explain就派上用场了,而后能够写出更加优化的sql,添加合适的索引,固然执行计划不是一层不变的,会根据数据库的实际状况改变。mysql
这边使用的是MariaDB数据库,MariaDB是目前最受关注的MySQL数据库衍生版,也被视为开源数据库MySQL的替代品,但它在扩展功能、存储引擎以及一些新的功能改进方面都强过MySQL。sql
由于我这这边就建了一张表,其实多表关联也是相似的,几张表就几行。数据库
id:这边的id是执行顺序,我也见过上下能够是同样的,我猜是同时执行的意思吧。session
select_type:有simple(简单表,既不使用表链接或者子查询),primary(主查询,即外层查询),union(union中第二个或者后面的查询语句),subquery(子查询中的第一个select)等。优化
table:结果集的表名。排序
type:查询访问方式,type=all(遍历全表匹配查找,出现这个就比较尴尬了);type=index(索引全扫描);type=range(索引范围扫描)常见于比较符号;type=ref(使用非惟一索引扫描或者惟一索引的前缀扫描);type=eq_ref(使用了惟一索引,多见于多表惟一索引关联);type=const/system(单表中最多有一个匹配行,根据主键或者惟一索引);type=NULL(不用访问表或者索引,直接能够获得结果)等。索引
possible_keys :表示查询可能使用的索引。io
key:表示实际使用的索引。table
key_len:使用索引字段的长度。扩展
rows:扫描行的数量。
Extra:对执行计划比较重要的状况的说明和描述。Using temporary是使用了临时表,Using filesort:MYSQL须要进行额外的步骤来返回的行排序,这两种都是须要优化的,还有其余的。
在mysql5.0.37开始支持对show profile的支持分析sql,使用select @@have_profiling看数据库是否支持
默认状况下,profiling是关闭的
能够经过set语句在session级别开启 set profiling=1
而后我执行一个比较耗时的操做
经过show profiles查看执行query_id
而后show profile for query语句能够看到执行过程当中每一个状态和消耗的时间。
能够看到上面的这个操做时间都花在了Sending date状态上。
周六是个好日子,阳光也正好!