一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

有一个业务是查询最新审核的5条数据

SELECT `id`, `title`
FROM `th_content`
WHERE `audit_time` < 1541984478AND `status` = 'ONLINE'
ORDER BY `audit_time` DESC, `id` DESC
LIMIT 5;

查看当时的监控情况 cpu 使用率是超过了100%,show processlist看到很多类似的查询都是处于create sort index的状态。

查看该表的结构

CREATE TABLE `th_content` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '内容标题',`content` mediumtext CHARACTER SET utf8 NOT NULL COMMENT '正文内容',`audit_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '审核时间',`last_edit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近编辑时间',`status` enum('CREATED','CHECKING','IGNORED','ONLINE','OFFLINE') CHARACTER SET utf8 NOT NULL DEFAULT 'CREATED' COMMENT '资讯状态',PRIMARY KEY (`id`),KEY `idx_at_let` (`audit_time`,`last_edit_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

索引有一个audit_time在左边的联合索引,没有关于status的索引。

分析上面的sql执行的逻辑:

  • 从联合索引里找到所有小于该审核时间的主键id(假如在该时间戳之前已经审核了100万条数据,则会在联合索引里取出对应的100万条数据的主键 id)
  • 对这100万个 id 进行排序(为的是在下面一步回表操作中优化 I/O 操作,因为很多挨得近的主键可能一次磁盘 I/O 就都取到了)
  • 回表,查出100万行记录,然后逐个扫描,筛选出status='ONLINE'的行记录
  • 最后对查询的结果进行排序(假如有50万行都是ONLINE,则继续对这50万行进行排序)

最后因为数据量很大,虽然只取5行,但是按照我们刚刚举的极端例子,实际查询了100万行数据,而且最后还在内存中进行了50万行数据库的内存排序。

所以是非常低效的。

画了一个示意图,说明第一步的查询过程,粉红色部分表示最后需要回表查询的数据行。
图中我按照索引存储规律来YY伪造填充了一些数据,如有不对请留言指出。希望通过这张图大家能够看到联合索引存储的方式和索引查询的方式

改进思路 1

范围查找向来不太好使用好索引的,如果我们增加一个audit_timestatus的联合索引,会有哪些改进呢?

ALTER TABLE `th_content` ADD INDEX `idx_audit_status` (`audit_time`, `status`);
mysql> explain select `id`, `title` from `th_content` where `audit_time` < 1541984478 and `status` = 'ONLINE' order by `audit_time` desc, `id` desc limit 5;
+----+-------------+------------+-------+------------------------------------------+------------------+---------+------+--------+-------------+
| id | select_type | table      | type  | possible_keys                            | key              | key_len | ref  | rows   | Extra       |
+----+-------------+------------+-------+------------------------------------------+------------------+---------+------+--------+-------------+
|  1 | SIMPLE      | th_content | range | idx_at_ft_pt_let,idx_audit_status        | idx_audit_status | 4       | NULL | 209754 | Using where |
+----+-------------+------------+-------+------------------------------------------+------------------+---------+------+--------+-------------+

细节:因为audit_time是一个范围查找,所以第二列的索引用不上了,只能用到audit_time,所以key_len是4。而下面思路2中,还是这两个字段key_len则是5。

还是分析下在添加了该索引之后的执行过程:

  • 从联合索引里找到小于该审核时间的audit_time最大的一行的联合索引
  • 然后依次往下找,因为< audit_time是一个范围查找,而第二列索引的值是分散的。所以需要依次往前查找,匹配出满足条件(status='ONLINE')的索引行,直到取到第5行为止。
  • 回表查询需要的具体数据

在上面的示意图中,粉红色标识满足第一列索引要求的行,依次向前查询,本个叶子节点上筛选到了3条记录,然后需要继续向左,到前一个叶子节点继续查询。直到找到5条满足记录的行,最后回表。

改进之处

因为在索引里面有status的值,所以在筛选满足status='ONLINE'行的时候,就不用回表查询了。在回表的时候只有5行数据的查询了,在iops上会大大减少。

该索引的弊端

如果idx_audit_status里扫描5行都是statusONLINE,那么只需扫描5行;
如果idx_audit_status里扫描前100万行中,只有4行statusONLINE,则需要扫描100万零1行,才能得到需要的5行记录。索引需要扫描的行数不确定

改进思路 2

ALTER TABLE `th_content` DROP INDEX `idx_audit_status`;
ALTER TABLE `th_content` ADD INDEX `idx_status_audit` (`status`, `audit_time`);

这样不管是排序还是回表都毫无压力啦。

 


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为你的AliOS Things应用增加自定义cli命令

在日常嵌入式开发中&#xff0c;我们经常会用串口命令来使设备进入某种特定的状态&#xff0c;或执行某个特定的操作。如系统自检&#xff0c;模拟运行&#xff0c;或者进入手动模式进行设备点动。linux下有强大的shell工具&#xff0c;可以让用户和片上系统进行交互&#xff0…

4________请拖拽到此区域5________请拖拽到此区域_5分钟学会:蒙版与通道(剪贴蒙版)...

剪贴蒙版可以用一个图层中包含像素的区域来限制它上层图像的显示范围。它的最大优点是可以通过一个图层来控制多个图层的可见内容&#xff0c;而图层蒙版和矢量蒙版都只能控制一个图层。1、实例&#xff1a;创建剪贴蒙版颜回&#xff1a;5分钟学会&#xff1a;蒙版与通道 实例&…

一场高质量的技术盛会怎样炼成?「2019中国大数据技术大会」即将来临,邀您共赴!...

2019年12月&#xff0c;一场轰动国内产业界、学术界、科研界及投资领域的顶级科技盛会即将拉开帷幕&#xff0c;它涵盖大数据、人工智能、云计算、AIoT、金融科技、智能制造等十几个前沿领域的热门话题。在过去十二年里&#xff0c;这场盛会从最初仅 60 余人参加的技术沙龙到如…

在Developerkit开发板上运行blink例程

本文将介绍怎么样在VScode环境下&#xff0c;将AliOS Tings提供的blink例程在Developerkit开发板上运行起来。 DeveloperKit开发板 在例程中分别用到两个led和一个按钮&#xff0c;上图中用红色的框标识出来。例程正确运行后&#xff0c;会有一个LED按1s的周期闪烁&#xff0c…

阿里下一代云分析型数据库AnalyticDB入选Forrester云化数仓象限

前言 近期, 全球权威IT咨询机构Forrester发布"The Forrester Wave: CloudData Warehouse Q4 2018"研究报告&#xff0c;阿里巴巴分析型数据库(AnalyticDB)成功入选。 AnalyticDB作为阿里巴巴自主研发的PB级实时云数据仓库&#xff0c;全面兼容MySQL协议以及SQL:200…

俄罗斯互联网的BAT

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff5c;挖数责编&#xff5c;阿秃1961年&#xff0c;尤里米尔纳 出生在莫斯科一个犹太人家庭&#xff0c;他的父亲是一名经济学家&#xff0c;母亲是一名医生&#xff0c;他儿时的梦想是成为科学家。高中毕业后&#xff0c…

fiq中断的入口地址_嵌入式技巧:ARM的三种中断调试方法介绍

嵌入式软件开发流程参照嵌入式软件的开发流程。第一步&#xff1a;工程建立和配置。第二步&#xff1a;编辑源文件。第三步&#xff1a;工程编译和链接。第四步&#xff1a;软件的调试。第五步&#xff1a;执行文件的固化。在整个流程中&#xff0c;用户首先需要建立工程并对工…

一文带你领略虚拟化领域顶级技术会议KVM Forum 2018

KVM Forum是由Linux基金会组织的高端技术论坛会议&#xff0c;主要为社区各个维护者&#xff0c;开发人员&#xff0c;和用户提供一个讨论Linux虚拟化技术发展趋势以及挑战的交流场所。参会人员都集中在KVM虚拟化相关领域&#xff0c;是KVM社区最为重要和权威的大会。 概述 2…

直击KubeCon 2018 |云原生正在改变你的衣食住行

云计算从不被看好到成长为势不可挡的技术潮流&#xff0c;仅仅用了十年的时间。如今“云原生”又被企业以及开发者奉为圭臬&#xff0c;并被认为是云计算的未来。 阿里云容器技术负责人易立认为云计算有三个阶段&#xff1a;云搬迁、云就绪和云原生。 第一个阶段是为了降低成…

玩大了!别再埋头学Python了,它真的无用!

在知乎上有一个特别火的问题&#xff1a;如何学Python&#xff1f;你会看到很多高赞回答是&#xff1a;我一天就学完了。在大家群嘲的背后&#xff0c;我们来分析一下&#xff0c;为什么在已经学过的人眼里&#xff0c;Python这么容易学&#xff0c;甚至简单到被某些人鄙视呢&a…

2020洪灾地图_卫星地图看洪灾:为何湖北易发洪水?

▲7月6日&#xff0c;武昌江滩凉亭被淹没。图片来源&#xff1a;中国气象局疫情甫定&#xff0c;洪水又来。入汛以来&#xff0c;长江中下游地区的日子并不好过。荆楚大地湖北遭遇多轮强降雨&#xff0c;引发严重洪涝灾害&#xff0c;让我们不禁将目光再次聚焦这里。荆楚大地为…

双十一高并发场景背后的数据库RDS技术揭秘

【战报】11月11日聚石塔&#xff08;阿里云数据库RDS产品形态&#xff09;峰值QPS突破X00w&#xff0c;Proxy 峰值QPS超过X00w。 双十一就要来了&#xff0c;全世界都为其疯狂&#xff0c;但是在双十一抢购中经常会出现几万人抢一个红包或者很多人共同购买一个商品的情况&…

Vue优化策略_项目发布_01

文章目录一、移除console 策略1. 命令1.1. 插件官网&#xff1a;1.2. 安装babel-plugin-transform-remove-console1.3. 在babel.config.js或者.babelrc文件中配置2. 图形化(推荐使用)2.1. 在线图形化安装插件2.2. 在babel.config.js或者.babelrc文件中配置二、生成打包报告1. 通…

双十一流量洪峰 支撑阿里核心业务的云数据库揭秘

背景介绍 今年双十一又有新纪录刷新&#xff0c;21秒成交额超10亿&#xff0c;数据瞬间膨胀到PB级&#xff0c;包裹数亿级&#xff0c;严苛的指标对数据库产品提出了更严格的需求。HybridDB作为阿里云自研的HTAP数据库经受住了流量洪峰的考验&#xff0c;顺利的完成了2019年双…

乘法原理的例题和答案_吃透高考数学17个必考题型,基础再差也能考130!(内附解题技巧+例题解析)...

2019高考数学难度比例为7&#xff1a;2&#xff1a;1&#xff0c;也就是说80%都是基础题。然而数学却是高考中最拉分的。90%的学生都缺少一套科学&#xff0c;高效的提分方法&#xff0c;尤其到了冲刺阶段&#xff01;为此&#xff0c;我们为大家整理了高考数学历年17个必考题型…

为何“爱辞职”成为了90后的又一标签?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | AlfredWu责编 | 阿秃金三银四金九银十&#xff0c;又到了每年的秋招时节。在各企业HR狂刷简历企图招贤纳士的同时&#xff0c;内部年轻员工心中实则也暗流涌动&#xff1a;他们有些已提交了辞呈&#xff0c;有些在骑驴找马物…

双11大考 POLARDB分钟级弹性让企业轻松扩展

POLARDB优势解读系列文章之——分钟级弹性 无处不在的脉冲计算 阿里有双11&#xff0c;中国有春运&#xff0c;高考后有分数出来的那天&#xff0c;歌迷心中有周杰伦演唱会门票在线开售之时。。。。有人的地方就有江湖&#xff0c;有人的地方也有脉冲计算&#xff0c;这些热点…

Vue优化策略_项目上线_02

接上一篇&#xff1a;Vue优化策略_项目发布_01 https://gblfy.blog.csdn.net/article/details/105359879 文章目录一、通过node创建web服务器1. 创建文件夹2. 初始化包管理配置文件3. 安装express插件4. 复制vue打包后dist5. 创建app.js配置6. 运行项目并浏览器访问二、开启gzi…

深度解析双十一背后的阿里云 Redis 服务

在一片欢呼之中&#xff0c;2018年的双十一完美收官&#xff0c;各项数据不出意外的刷出了新的记录&#xff0c;亮眼的数据背后是阿里过硬的技术支撑。其中阿里云Redis不仅保障了阿里集团内部业务双十一的流量洪峰平稳度过&#xff0c;也让使用阿里云Redis的各个客户度过了一个…

oracle中prad函数_等保测评2.0:Oracle身份鉴别

一、说明本篇文章主要说一说oracle数据库中身份鉴别控制点中测评项a的相关内容和理解。二、测评项aa)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b;三、测评项a要求1应对登录的用户进行身份标…