副问题[/!--empirenews.page--]

最近通过一个日记表做排行的时辰发明出格卡,最后题目获得了办理,梳理一些索引和MySQL执行进程的履历,可是最后照旧有5个谜题没解开,但愿各人资助解答下
首要包括如下常识点
- 用数据措辞证明慢日记的扫描行数到底是怎样统计出来的
- 从 group by 执行道理找出优化方案
- 排序的实现细节
- gdb 源码调试
配景
必要别离统计本月、本周被会见的文章的 TOP10。日记表如下
- CREATE TABLE `article_rank` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `aid` int(11) unsigned NOT NULL,
- `pv` int(11) unsigned NOT NULL DEFAULT '1',
- `day` int(11) NOT NULL COMMENT '日期 譬喻 20171016',
- PRIMARY KEY (`id`),
- KEY `idx_day_aid_pv` (`day`,`aid`,`pv`),
- KEY `idx_aid_day_pv` (`aid`,`day`,`pv`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
筹备事变
为了可以或许清楚的验证本身的一些意料,在假造机里安装了一个 debug 版的 mysql,然后开启了慢日记网络,用于统计扫描行数
安装
- 下载源码
- 编译安装
- 建设 mysql 用户
- 初始化数据库
- 初始化 mysql 设置文件
- 修改暗码
假如你乐趣,详细可以参考我的博客,一步步安装 https://mengkang.net/1335.html
开启慢日记
编辑设置文件,在[mysqld]块下添加
- slow_query_log=1
- slow_query_log_file=xxx
- long_query_time=0
- log_queries_not_using_indexes=1
机能说明
发明题目
若是我必要查询2018-12-20 ~ 2018-12-24这5天赏识量最大的10篇文章的 sql 如下,起首行使explain看下说明功效
- mysql> explain select aid,sum(pv) as num from article_rank where day>=20181220 and day<=20181224 group by aid order by num desc limit 10;
- +----+-------------+--------------+------------+-------+-------------------------------+----------------+---------+------+--------+----------+-----------------------------------------------------------+
-
- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
-
- +----+-------------+--------------+------------+-------+-------------------------------+----------------+---------+------+--------+----------+-----------------------------------------------------------+
-
- | 1 | SIMPLE | article_rank | NULL | range | idx_day_aid_pv,idx_aid_day_pv | idx_day_aid_pv | 4 | NULL | 404607 | 100.00 | Using where; Using index; Using temporary; Using filesort |
-
- +----+-------------+--------------+------------+-------+-------------------------------+----------------+---------+------+--------+----------+-----------------------------------------------------------+
体系默认会走的索引是idx_day_aid_pv,按照Extra信息我们可以看到,行使idx_day_aid_pv索引的时辰,会走包围索引,可是会行使姑且表,会有排序。
我们查察下慢日记里的记录信息
- # Time: 2019-03-17T03:02:27.984091Z
- # User@Host: root[root] @ localhost [] Id: 6
- # Query_time: 56.959484 Lock_time: 0.000195 Rows_sent: 10 Rows_examined: 1337315
- SET timestamp=1552791747;
- select aid,sum(pv) as num from article_rank where day>=20181220 and day<=20181224 group by aid order by num desc limit 10;
为什么扫描行数是 1337315
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|