如何通过自动增加索引,实现数据库查询耗时降低50%?
作者 | 利开园
责编 | Carol
封图 | CSDN 下载自视觉中国
很多开发者都遇到类似这样的经历:一个产品功能开发测试都正常,发布上线后也正常,但是过一段后,如果有个活动或流量一大程序就突然卡了,也有可能流量正常也没搞活动,但是过一段时间后程序响应越来越慢,这个时候一般都要花很大精力去排查原因,最后发现是数据库查询没有索引导致的。流量大或数据量增加后会导致请求变慢,加上索引就正常了。
在小程序云开发的数据库场景下,我们会思考为什么会出现这样的问题?为什么用户总是会忘记加索引?能不能让用户无需关心这个问题,数据库自动加上索引?
业界方案及其问题
针对这个问题,业界一般采用的是全量索引的方案:通过给所有的字段加单字段索引,引导用户主动添加多字段索引,从而实现保证所有的查询都有索引。但这样代价是会有大量的冗余索引,占用了大量的磁盘空间,而且,一些多字段的场景下,依然需要用户参与。这样的方案不能满足云开发 Cloudbase 的需求。
云开发数据库自动化索引
在这个问题上,腾讯云和微信联合推出的小程序云开发,就做出了比较积极的应对措施。在其对业务进行分析后,提出了自己的解决方案 —— 分析数据并自动建立索引。针对系统中查询较慢的用户请求,自动分析出最佳建立索引的方式,并基于此建立索引,从而覆盖了单字段索引和多字段索引的情况。
想要理解自动建立索引,就要了解如何手动建立索引:对于单字段索引,建立起来比较简单,无论升序还是降序都是一样的。但对于多字段组合索引时,会有各种方式来建立索引,比如,三个字段的索引,就会受限制于索引是否覆盖了三个不同的字段、字段相应的升降序是否匹配,如果不匹配,可能索引就没有效果。
正因为加好索引并不简单,也证明自动加索引势在必行。而要做好自动增加索引遇到的主要问题有:
如何尽量减少索引个数避免影响写入性能和磁盘消耗过多。
如何避免添加索引导致的锁表影响正常的用户数据查询。
如何尽量规避加索引触发未知问题。
自动增加的索引如何自动删除。
针对这些问题,小程序云开发的解决方案是:通过筛选出耗时超过一定阈值的查询语句,从而获得需要进行优化的数据库查询,并依据数据库索引的前缀匹配规则,按照最少创建索引数量的原则,增加相应的索引,尽量让索引覆盖到所有的查询语句。
为了避免添加索引导致的锁表影响用户的数据查询,小程序云开发在具体添加索引的时候,采用了异步添加索引的方式,这是云开发数据库的一个关键能力。另外,通过限制单个数据库增加索引的频率和数量来规避未知风险,通过分析线上数据优化自动索引增加算法。最后会定期筛选那些长时间没有被查询命中的索引,对其进行删除,确保系统不会存在太多的冗余索引影响性能。
上述自动索引的整个过程对于用户来说,都是不可见且无感知的。不过,在实际的上线过程中,大盘的数据查询整体耗时减少了 50%,用户侧的体验也发现程序速度突然变快了。
总结
自动索引的方案帮助云开发 Cloudbase 解决了大多数的数据库查询较慢的问题,但程序总有覆盖不到的部分,对于这一部分,小程序云开发表示:后续会在开发阶段提示增加相应的索引,以及提供慢查询日志导出和自定义告警功能,让用户感知到问题, 从而在业务逻辑上进行优化。
作者简介:利开园,腾讯云云开发团队成员,腾讯高级开发工程师
推荐阅读
浅谈分布式存储中的网络通信
138 张图带你 MySQL 入门!
如何在 Kubernetes 上配置 Jenkins?
突发!印度封禁抖音、微信、快手等 59 款中国 App
厉害!国内大学生计算机编程第一人,一人挑战一个队,百度最年轻 T10,现创业自动驾驶
Balancer因通缩代币STA遭遇闪电贷攻击,价值50万美元资产被黑
浅谈分布式存储中的网络通信
真香,朕在看了!
如何通过自动增加索引,实现数据库查询耗时降低50%?相关推荐
- 如何通过自动增加索引,实现数据库查询耗时降低50%
作者 | 利开园 责编 | Carol 封图 | CSDN 下载自视觉中国 很多开发者都遇到类似这样的经历:一个产品功能开发测试都正常,发布上线后也正常,但是过一段后,如果有个活动或流量一大程序就突然 ...
- MySql索引查询优化 千万级数据普通查询和建立索引后数据查询耗时对比
前言 索引:拿汉语字典的目录页(索引)打比方,我们可以按拼音.笔画.偏旁部首等排序的目录(索引)快速查找到需要的字. 索引分单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列 ...
- mysql查询耗时_一种数据库高耗时查询的自动取消方法与流程
本发明涉及数据库的查询方法,特别涉及一种数据库高耗时查询的自动取消方法. 背景技术: 有很多关系型数据库查询业务非常耗时,比如查询企业实时报表之类的,一次查询可能需要几分钟甚至更长.在很多时候,前端业 ...
- mysql or走索引吗_加了索引,mysql查询就一定会用吗?
小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况.我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是D ...
- 加了索引,mysql查询就一定会用吗?
小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况.我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是D ...
- mysql,索引命中,查询级别
mysql索引无法命中情况 1,查询占表数据30%以上 2,小表查询 3,规定不用索引查询 4,查询条件给字符串加引号用索引,否则不用 5,条件中用到or,除非涉及到的列都有索引否则不命中 6,lik ...
- 数据库查询性能优化之利器—索引(二)
数据库查询性能优化之利器-索引(二) 在前面一篇文章中谈到适当地建立索引能够大幅度地提升SQL语句查询速度,然而并不是在什么情况下都适合建立索引,下面来谈一下什么情况下适合建立索引.建立什么样的索引以 ...
- mysql添加索引后查询先用索引吗_mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。还是查询的时候有单 独的参数查询索引?...
满意答案 llt1711 2014.06.20 采纳率:49% 等级:9 已帮助:614人 MYSQL创建索引对索引使用方式分两种: 1 由数据库查询优化器自动判断否使用索引: 2 用户写SQL ...
- Mysql 数据库表中有索引为什么还是查询慢?
问题分析 在进行数据库查询的时候,我们都知道索引可以加快数据查询的效率.但是在实际的业务场景下,经常会遇到即使在表中增加了索引,但是同样还是会出现数据查询慢的问题.这就需要具体分析数据查询慢的具体原因 ...
最新文章
- 在.net中运用HTMLParser解析网页的原理和方法
- 微软官方工具MediaCreationTool制作U盘Windows10启动盘教程
- 【深度学习】实战深度学习检测疟疾
- Java中input与output_java中的Io(input与output)操作总结(四)
- jenkins jboss_与JBoss Fuse,Jenkins和Nexus的持续集成
- 蓝桥杯 基础练习 报时助手
- Sendmail with Attachment script
- str.trim()去除空格
- 传统项目管理和敏捷项目管理的区别是什么?
- sap 双计量单位_SAP 基本计量单位更改(转载)
- 华理计算机专硕奖学金,华东理工大学研究生课程学习奖学金评定方法(试行)
- java判断闰年中闰月_闰年闰月查询表_闰月查询表_闰年查询表-万年历
- 边境的悍匪—机器学习实战:第九章 无监督学习任务
- 时值年末,年度CSDN小峯的回顾过去的2020年(推荐)
- 仿照京东导航条html+css
- 编程题:核桃的数量(求最小公倍数的问题)
- UOJ #141. 【UER #4】量子态的棋盘
- 藏书馆App基于Rainbond实现云原生DevOps的实践
- cdn部署php,Typecho博客全站部署腾讯云CDN教程
- pku_oj: W11-01 最大素数问题 (C++)
热门文章
- leetcode 111 --- 二叉树最小深度
- mysql 5.5 查询_mysql5.5数据库优化--定位慢查询
- mysql group_concat去重_mysql 数据库group_concat函数的一些用法
- 备份数据库的expdp语句_【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)...
- 100999凑整到万位进一_四年级数学专项练习
- 音频重采样有什么用_最佳音频接口基本购买指南
- 海底光缆——你不知道的秘密!
- 预测2019那些可能改变我们生活的技术
- 李开复:AI能在15年内取代40%~50%岗位
- 数风·数林 | 炉石传说中的概率(声控篇)