MySQL性能优化——Explain使用分析( 三 )


ref:显示索引的查询条件 , 常量的效果最好 。
例1:EXPLAIN SELECT * FROM order_info WHERE user_id = 1 AND product_name = 'p1'
MySQL性能优化——Explain使用分析文章插图
执行结果
ref一列显示两个常量 , 代表查询条件中两个 常量参数 。
例2:explain SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id;
MySQL性能优化——Explain使用分析文章插图
执行结果
上图中执行order_info表时 , 先进行了索引扫描(tpye类型是index) , 然后在其结果集中 , 用order_info.user_id(ref 列中的值)去user_info表中做匹配 。
rows:是一个重要的字段. MySQL 查询优化器根据统计信息, 估算 SQL 要查找到结果集需要扫描读取的数据行数 , 这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好 。
Extra:EXPLAIN中很多额外信息会显示在Extra上 , 常见有如下几种内容:

  • Using filesort
当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大 。 例如下面的例子:explain SELECT * FROM order_info ORDER BY product_name
MySQL性能优化——Explain使用分析文章插图
执行结果
我们的索引是 KEY `user_product_detail_index` (`user_id`, `product_name`, `productor`)但是上面的查询中根据 product_name 来排序, 因此不能使用索引进行优化, 进而会产生 Using filesort 。 如果我们将排序依据改为 ORDER BY user_id, product_name, 那么就不会出现 Using filesort 了 。
例如:explain SELECT * FROM order_info ORDER BY user_id,product_name;
MySQL性能优化——Explain使用分析文章插图
执行结果
  • Using index:“索引覆盖” , 表示查询在索引中可以满足 , 不需要回表 。
  • Using temporary:查询有使用临时表 , 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化 。
以上就是我对MySQL执行计划的理解和使用经验 , 希望给各位带来一些帮助 。
附录:演示脚本
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 '',


推荐阅读