MYSQL: Handler_read_%参数说明
表t_feed_idx(user_id bigint, feed_id bigint, KEY (`user_id`,`feed_id`)) engine=innodb;
表t_feed_info(feed_id bigint, PRIMARY KEY (`feed_id`), '其他列') engine=innodb;feed 总数 : 100000用户(ID:20000001) feed 数 : 200
查询
######### 单表
> 全部扫描
EXPLAIN SELECT * FROM `t_feed_info` AS i ORDER BY NULL LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i ALL \\N \\N \\N \\N 98734
Handler_read_first + 1 : 从(主)键的第一个位置开始读取
Handler_read_key + 1 : 根据第一个位置的KEY读1行,其他9行是根据叶节点的链表依次读取
Handler_read_rnd_next +10 : 从主键的叶节点(行数据)中顺序读取10行
> 索引扫描
EXPLAIN SELECT * FROM `t_feed_info` AS i ORDER BY feed_id LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i index \\N PRIMARY 8 \\N 10
Handler_read_first + 1 : 从(主)键的第一个位置开始读取
Handler_read_key + 1 : 根据第一个位置的KEY读1行
Handler_read_next + 9 : 按(主)键顺序依次读取之后的9行
EXPLAIN SELECT * FROM `t_feed_info` AS i ORDER BY feed_id DESC LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i index \\N PRIMARY 8 \\N 10
Handler_read_key + 1 : 根据第一个位置的KEY读1行
Handler_read_last + 1 : 从(主)键的最后一个位置开始读取
Handler_read_prev + 9 : 按(主)键顺序依次读取之前的9行
> 索引覆盖扫描
EXPLAIN SELECT feed_id FROM `t_feed_info` AS i ORDER BY feed_id LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i index \\N PRIMARY 8 \\N 10 Using index
Handler_read_first + 1 : 从(主)键的第一个位置开始读取
Handler_read_key + 1 : 根据第一个位置的KEY读1行
Handler_read_next + 9 : 按(主)键顺序依次读取之后的9行
EXPLAIN SELECT feed_id FROM `t_feed_info` AS i ORDER BY feed_id DESC LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i index \\N PRIMARY 8 \\N 10 Using index
Handler_read_key + 1 : 根据第一个位置的KEY读1行
Handler_read_last + 1 : 从(主)键的最后一个位置开始读取
Handler_read_prev + 9 : 按(主)键倒序依次读取之后的9行
############### join
# set @uid := '20000001';
# asc
EXPLAIN SELECT * FROM `t_feed_idx` AS i
LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id`
WHERE i.user_id=@uid ORDER BY i.feed_id LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i ref user_id user_id 8 const 200 Using where; Using index
- 1 SIMPLE f eq_ref PRIMARY PRIMARY 8 z3.i.feed_id 1
Handler_read_key + 11 : t_feed_idx 根据user_id读1次,t_feed_info根据feed_id读10次
Handler_read_next + 9 : t_feed_idx按键顺序依次向后读取9个feed_id
EXPLAIN SELECT * FROM `t_feed_idx` AS i
LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id`
WHERE i.user_id=@uid ORDER BY i.feed_id desc LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i ref user_id user_id 8 const 200 Using where; Using index
- 1 SIMPLE f eq_ref PRIMARY PRIMARY 8 z3.i.feed_id 1
Handler_read_key + 11 : t_feed_idx 根据user_id读1次,t_feed_info根据feed_id读10次
Handler_read_prev + 9 : t_feed_idx按键倒序依次向前读取9个feed_id
# 不好的查询方式:
> 使用被关联表t_feed_info的feed_id列进行排序
LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id`
WHERE i.user_id=@uid ORDER BY f.feed_id LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i ref user_id user_id 8 const 200 Using index; Using temporary; Using filesort
- 1 SIMPLE f eq_ref PRIMARY PRIMARY 8 z3.i.feed_id 1
Handler_read_key + 201 : t_feed_idx 根据user_id读1次,t_feed_info根据feed_id读200次
Handler_read_next + 200 : t_feed_idx按键顺序依次读取199个feed_id. 额外的1次是??
Handler_read_rnd + 10 : filesort后每行位置都是固定的,limit 10取10行
Handler_read_rnd_next + 201: filesort全表遍历读取temporary表中的200行,进行排序; 额外的1是EOF标志位;
Using temporary; Using filesort 原因: 无法使用t_feed_idx表的索引
1>先查询表t_feed_idx中满足@uid的200行与表t_feed_info进行join,将结果保存在temporary表
Handler_read_key + 201, Handler_read_next + 200
2>然后对临时表排序;
Handler_read_rnd_next + 201
3>取前10个。
Handler_read_rnd + 10
> where条件放在join中
LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id` AND i.user_id=@uid
ORDER BY i.`feed_id` DESC LIMIT 0, 10;
点击(此处)折叠或打开
- id select_type table type possible_keys key key_len ref rows Extra
- 1 SIMPLE i index \\N user_id 16 \\N 100396 Using index; Using filesort
- 1 SIMPLE f eq_ref PRIMARY PRIMARY 8 z3.i.feed_id 1
Handler_read_first + 1 : 从表t_feed_idx 中user_id索引开始位置进行读取
Handler_read_key + 11 : t_feed_idx 根据user_id读1次,t_feed_info根据feed_id读10次
Handler_read_rnd_next + 100001: filesort全表遍历读取表t_feed_idx 中user_id索引的100000行,进行排序; 额外的1是EOF标志位;
没有 Using temporary 是因为先对t_feed_idx的索引user_id进行排序,然后再join
Using filesort 原因:
无法使用t_feed_idx表的索引
1>先对表t_feed_idx排序,取10个feed_id
Handler_read_first + 1, Handler_read_key + 1, Handler_read_rnd_next + 100001
2>然后根据feed_id与表t_feed_info进行join
Handler_read_key + 10
参考: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/
MYSQL: Handler_read_%参数说明的更多相关文章
- MySql配置参数很全的Mysql配置参数说明
MySql配置参数 很全的Mysql配置参数说明 1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很 ...
- mysql CMAKE 参数说明
MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,你在安装源文件中找不到configure文件是正常的.很多人下到了新版的MySQL,因为找不到configure文件,不知道该怎么继续 ...
- MySQL 启动参数说明及性能优化建议
[mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用 ...
- MySQL slave_exec_mode 参数说明
背景: 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式(幂 ...
- MySQL配置参数说明
MYSQL服务器my.cnf配置参数详解: 硬件:内存16G [client] port = 3306 socket = /data/mysql.sock [mysql] no-auto-rehash ...
- mysql 部分参数说明
log_timestamps [5.7] This variable was added in MySQL 5.7.2. Before 5.7.2, timestamps in log message ...
- MySQL常用参数说明(持续更新)
##innodb correlate innodb_flush_log_at_trx_commit value: 0,[1],2 effect: control the flush opera ...
- CentOS 7 安装 配置 MySQL
第一部分:CentOS 7安装MySQL 5.7 1.下载YUM库 shell > wget http://dev.mysql.com/get/mysql57-community-release ...
- MySQL 第一篇
一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数 ...
随机推荐
- 关系数据库&&NoSQL数据库
在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发.因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库. ...
- 闲置小U盘变身最强大路由器
小容量 U 盘,用起来嫌容量太少,丢了好像又觉得太可惜.不过现在将它进行一番小改造后,配合我们的电脑 ,就能得到一台强大的路由器,不仅省了买路由的钱,而且这台路由器在市面上基本买不到 ! DD ...
- remoting blazeds 实施步骤
remoting 实施步骤 1.创建 --web project 和 -- Flex project 2.在web project 下创建 -- com.HelloRemoting: package ...
- 检查 CPU 是否支持二级地址转换 - 摘自网络
Windows 8 Consumer Preview 于2月正式发布,随后 Windows Server 8 Beta 也公布了下载.整体对比,Windows 8 在硬件方面的要求并不高,其最低硬件需 ...
- 轻松学习Linux之认识内存管理机制
本文出自 "李晨光原创技术博客" 博客,谢绝转载!
- koa redis 链接
koa 是新一代框架 npm install koa-redis 代码如下 var koa = require('koa'); var http = require('http'); var sess ...
- 【下载】支持中文的 jspSmartUpload jar 包
http://www.blogjava.net/hijackwust/archive/2007/08/22/138598.html —————————————————————————————————— ...
- linux du命令: 显示文件、目录大小
介绍:du命令用于显示指定文件(夹)在磁盘中所占的空间信息.假如指定的文件参数实际上是一个目录,就要计算该目录下的所有文件.假如 没有提供文件参数,执行du命令,显示当前目录内的文件占用空间信息. 语 ...
- 关于诺顿身份安全2013独立版(Norton Identity Safe)
现在身份安全这货好像从诺顿的套装当中独立出来了,出了中文版.其实诺顿的Web信誉做得还是不错的,当然天朝不要有太大期望.只是公认的做web信誉做得最好的应该就是趋势科技和诺顿,所以诺顿的身份安全也许还 ...
- CCS5 编译器手动设置dsp支持可变参数宏等问题
IDE:CSS5.4,compiler不支持可变参数宏.需要手动设置编译器相关选项: Language Option->Language Mode —>no strict ANSI. 1. ...