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;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 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;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 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;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 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;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 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;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 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‘;

> WHERE + 排序
    # asc
    EXPLAIN SELECT * FROM `t_feed_idx` AS i

LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id`
    WHERE [email protected] ORDER BY i.feed_id LIMIT 0, 10;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 1    SIMPLE    i    ref    user_id    user_id    8    const    200    Using where; Using index
  3. 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

# desc
    EXPLAIN SELECT * FROM `t_feed_idx` AS i

LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id`
    WHERE [email protected] ORDER BY i.feed_id desc LIMIT 0, 10;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 1    SIMPLE    i    ref    user_id    user_id    8    const    200    Using where; Using index
  3. 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列进行排序

EXPLAIN SELECT * FROM `t_feed_idx` AS i

LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id`
    WHERE [email protected] ORDER BY f.feed_id LIMIT 0, 10;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 1    SIMPLE    i    ref    user_id    user_id    8    const    200    Using index; Using temporary; Using filesort
  3. 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中

EXPLAIN SELECT * FROM `t_feed_idx` AS i
    LEFT JOIN `t_feed_info` AS f ON f.`feed_id`=i.`feed_id` AND [email protected] 
    ORDER BY i.`feed_id` DESC LIMIT 0, 10;

点击(此处)折叠或打开

  1. id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
  2. 1    SIMPLE    i    index    \\N    user_id    16    \\N    100396    Using index; Using filesort
  3. 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/

时间: 2024-08-19 06:13:51

MYSQL: Handler_read_%参数说明的相关文章

MySql配置参数很全的Mysql配置参数说明

MySql配置参数 很全的Mysql配置参数说明 1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程. back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中.如果系统在一个短时间内有很多连接,则需 要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小.不同的操作系统在这个队列大小上有它自己的限制.试图设定b

mysql CMAKE 参数说明

MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,你在安装源文件中找不到configure文件是正常的.很多人下到了新版的MySQL,因为找不到configure文件,不知道该怎么继续下去.有没有一篇可供参考的文章呢?其实在http://forge.mysql.com网站上有一篇文章,专门介绍了如何用CMake工具进行新版MySQL的编译安装. 原文地址为:http://forge.mysql.com/wiki/Autotools_to_CMake_Transition_Guid

nginx配置参数详解 && mysql CMAKE 参数说明!

http://nginx.org/en/docs/configure.html https://www.cnblogs.com/hllnj2008/p/4043778.html Nginx工作原理和优化总结: https://blog.csdn.net/hguisu/article/details/8930668 原文地址:http://blog.51cto.com/python20101030/2348434

mysql url 参数说明

-------------------------------------------------------------------------- useUnicode: [true|false] 是否使用编码集,需配合 characterEncoding 参数使用. characterEncoding: [utf-8|gbk|...] 编码类型. useSSL: [true:false] 是否使用SSL协议. serverTimezone: [UTC|Asia/Shanghai|...] 时

详解使用DockerHub官方的mysql镜像生成容器

收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!>>>   摘要: 详解使用DockerHub官方的mysql镜像生成容器 一.下载官方的mysql镜像: 二.生成容器 : 三.进入到新生成的容器: 四.修改容器中mysql的配置文件 . 写在前面:看到网上关于利用DockerHub官方的mysql镜像生成容器此类的文档比较少,故结合自身实践分享给大家,还望多多指教. 我的需求:利用docker

MySQL 第二篇

一.MySQL多实例介绍 mysql多实例,共用一套mysql安装程序,使用不同的配置文件(my.cnf).启动程序.和数据文件,即在一台服务器上同时开启多个不同的服务器端口(3306,3307),同时运行多个mysql服务进程,这些服务进程通过不同的socket监听不同的服务器端口来提供服务. 二.安装mysql多实例 1.下载mysql/cmake安装包 1 2 3 [[email protected] ~]# mkdir /home/tools [[email protected] ~]#

Linux(CentOS或RadHat)下MySQL源码安装

安装环境: CentOS6.3 64位 软件: Mysql-5.6 所需包: gcc/g++ :MySQL 5.6开始,需要使用g++进行编译.cmake  :MySQL 5.5开始,使用cmake进行工程管理,cmake需要2.8以上版本.bison  :MySQL语法解析器需要使用bison进行编译.ncurses-devel :用于终端操作的开发包.zlib    :MySQL使用zlib进行压缩 有关库包下载: 可以自己去官网下载,也可以去网盘下载 http://pan.baidu.co

mysql,sqlsever,oracle,redis,mongo,postgres等数据库备份及恢复指令整理

下列仅整理给出各个数据库备份及恢复最简单的用法,更多详细的参数及配置请查阅相关资料 一.mysql: 参数说明: $user $password $targethost $port $charset $dbname $table $filename 用户名 密码 ip(本地为localhost) 端口 编码 数据库名 表名(仅表级备份需要) 文件名 备份:mysqldump --single-transaction -l -u $user -p'$password' -h $targethost

0029-如何实现CDH元数据库MySQL的主备

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.文档编写目的 MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的扩展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能.本文档讲述如何实现MySQL主从复制.注:本文档实现的MySQL主备模式为Active-Passive而不是Active-Active,如果使用双活的方式,建议企业内部配备MySQL的DBA来维护MySQL.CDH集群在运行过程中,MySQL