在日常工作中,可以通过开启慢查询记录一些执行时间比较久的SQL语句,设置的具体步骤如下:
1)将slow_query_log全局变量设置为“ON”状态。
set global slow_query_log='ON';
2)设置慢查询日志存放的位置。
set global slow_query_log_file='/var/log/mysql/slow.log'[3]
3)设置查询超过4s就记录。
set global long_query_time=4;
通过上面设置,在log文件中记录了超过4s的SQL语句,可以用explain命令来查看这些SQL语句的执行计划,查看SQL语句有没有使用索引,有没有全表扫描。例如查看查询商品语句的执行计划:
EXPLAIN SELECT*FROM product
执行结果如图10-3所示。
图10-3 全表扫描EXPLAIN执行结果
执行explain命令后,展现信息有10列,分别是id、select_type、table、type、possible_ keys、key、key_len、ref、rows、Extra,下面对这些字段进行讲解:
■id:SELECT识别符。这是SELECT查询序列号。
■select_type:表示查询中每个select子句的类型。
■table:表示查询的表。
■type:表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有:NULL、system、const、eq_ref、ref、range、index、ALL(从左到右,性能从好到差)。
1)NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
2)system:表仅有一行,这是const类型,一般不会出现,可以忽略不计。
3)const:数据表最多只有一个匹配行,因为只匹配一行数据,所以很快,常用于PRIMARY KEY或者UNIQUE索引的查询,可以认为const是最优化的。如图10-4所示。
(www.xing528.com)
图10-4 主键查询EXPLAIN执行结果
4)eq_ref:使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique key作为关联条件。这里演示使用方式,添加一个订单表t_order。表结构如下:
注意t_order表的product_id与商品表product的id字段进行关联。如图10-5所示。
图10-5 多表关联查询EXPLAIN执行结果
5)ref:查询条件索引既不是UNIQUE也不是PRIMARY KEY的情况。ref可用于“=”操作符的带索引的列。这里以product表的price字段进行演示,此字段需建立索引。如图10-6所示。
图10-6 索引关联查询EXPLAIN执行结果
6)Range:只检索给定范围的行,使用一个索引来选择行。注意product表的price字段建立了索引。如图10-7所示。
图10-7 范围查询EXPLAIN执行结果
7)Index:Full Index Scan,index与ALL的区别是index类型只遍历索引树。
8)ALL:MySQL将遍历全表以找到匹配的行(性能最差)。
■possible_keys:指出MySQL能使用哪个索引在该表中找到行。如果该列为NULL,说明没有使用索引,可以对该列创建索引来提高性能。
■key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。可以强制使用索引或者忽略索引。
■key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。
■ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
■rows:显示MySQL认为它执行查询时必须检查的行数。
■Extra:该列包含MySQL解决查询的详细信息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。