作者 | 利开园

责编 | Carol

封图 | CSDN 下载自视觉中国

很多开发者都遇到类似这样的经历:一个产品功能开发测试都正常,发布上线后也正常,但是过一段后,如果有个活动或流量一大程序就突然卡了,也有可能流量正常也没搞活动,但是过一段时间后程序响应越来越慢,这个时候一般都要花很大精力去排查原因,最后发现是数据库查询没有索引导致的。流量大或数据量增加后会导致请求变慢,加上索引就正常了。

在小程序云开发的数据库场景下,我们会思考为什么会出现这样的问题?为什么用户总是会忘记加索引?能不能让用户无需关心这个问题,数据库自动加上索引?

业界方案及其问题

针对这个问题,业界一般采用的是全量索引的方案:通过给所有的字段加单字段索引,引导用户主动添加多字段索引,从而实现保证所有的查询都有索引。但这样代价是会有大量的冗余索引,占用了大量的磁盘空间,而且,一些多字段的场景下,依然需要用户参与。这样的方案不能满足云开发 Cloudbase 的需求。

云开发数据库自动化索引

在这个问题上,腾讯云和微信联合推出的小程序云开发,就做出了比较积极的应对措施。在其对业务进行分析后,提出了自己的解决方案 —— 分析数据并自动建立索引。针对系统中查询较慢的用户请求,自动分析出最佳建立索引的方式,并基于此建立索引,从而覆盖了单字段索引和多字段索引的情况。

想要理解自动建立索引,就要了解如何手动建立索引:对于单字段索引,建立起来比较简单,无论升序还是降序都是一样的。但对于多字段组合索引时,会有各种方式来建立索引,比如,三个字段的索引,就会受限制于索引是否覆盖了三个不同的字段、字段相应的升降序是否匹配,如果不匹配,可能索引就没有效果。

正因为加好索引并不简单,也证明自动加索引势在必行。而要做好自动增加索引遇到的主要问题有:

  1. 如何尽量减少索引个数避免影响写入性能和磁盘消耗过多。

  2. 如何避免添加索引导致的锁表影响正常的用户数据查询。

  3. 如何尽量规避加索引触发未知问题。

  4. 自动增加的索引如何自动删除。

针对这些问题,小程序云开发的解决方案是:通过筛选出耗时超过一定阈值的查询语句,从而获得需要进行优化的数据库查询,并依据数据库索引的前缀匹配规则,按照最少创建索引数量的原则,增加相应的索引,尽量让索引覆盖到所有的查询语句。

为了避免添加索引导致的锁表影响用户的数据查询,小程序云开发在具体添加索引的时候,采用了异步添加索引的方式,这是云开发数据库的一个关键能力。另外,通过限制单个数据库增加索引的频率和数量来规避未知风险,通过分析线上数据优化自动索引增加算法。最后会定期筛选那些长时间没有被查询命中的索引,对其进行删除,确保系统不会存在太多的冗余索引影响性能。

上述自动索引的整个过程对于用户来说,都是不可见且无感知的。不过,在实际的上线过程中,大盘的数据查询整体耗时减少了 50%,用户侧的体验也发现程序速度突然变快了。

总结

自动索引的方案帮助云开发 Cloudbase 解决了大多数的数据库查询较慢的问题,但程序总有覆盖不到的部分,对于这一部分,小程序云开发表示:后续会在开发阶段提示增加相应的索引,以及提供慢查询日志导出和自定义告警功能,让用户感知到问题, 从而在业务逻辑上进行优化。

作者简介:利开园,腾讯云云开发团队成员,腾讯高级开发工程师

推荐阅读
  • 浅谈分布式存储中的网络通信

  • 138 张图带你 MySQL 入门!

  • 如何在 Kubernetes 上配置 Jenkins?

  • 突发!印度封禁抖音、微信、快手等 59 款中国 App

  • 厉害!国内大学生计算机编程第一人,一人挑战一个队,百度最年轻 T10,现创业自动驾驶

  • Balancer因通缩代币STA遭遇闪电贷攻击,价值50万美元资产被黑

  • 浅谈分布式存储中的网络通信

真香,朕在看了!

如何通过自动增加索引,实现数据库查询耗时降低50%?相关推荐

  1. 如何通过自动增加索引,实现数据库查询耗时降低50%

    作者 | 利开园 责编 | Carol 封图 | CSDN 下载自视觉中国 很多开发者都遇到类似这样的经历:一个产品功能开发测试都正常,发布上线后也正常,但是过一段后,如果有个活动或流量一大程序就突然 ...

  2. MySql索引查询优化 千万级数据普通查询和建立索引后数据查询耗时对比

    前言 索引:拿汉语字典的目录页(索引)打比方,我们可以按拼音.笔画.偏旁部首等排序的目录(索引)快速查找到需要的字. 索引分单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列 ...

  3. mysql查询耗时_一种数据库高耗时查询的自动取消方法与流程

    本发明涉及数据库的查询方法,特别涉及一种数据库高耗时查询的自动取消方法. 背景技术: 有很多关系型数据库查询业务非常耗时,比如查询企业实时报表之类的,一次查询可能需要几分钟甚至更长.在很多时候,前端业 ...

  4. mysql or走索引吗_加了索引,mysql查询就一定会用吗?

    小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况.我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是D ...

  5. 加了索引,mysql查询就一定会用吗?

    小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况.我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是D ...

  6. mysql,索引命中,查询级别

    mysql索引无法命中情况 1,查询占表数据30%以上 2,小表查询 3,规定不用索引查询 4,查询条件给字符串加引号用索引,否则不用 5,条件中用到or,除非涉及到的列都有索引否则不命中 6,lik ...

  7. 数据库查询性能优化之利器—索引(二)

    数据库查询性能优化之利器-索引(二) 在前面一篇文章中谈到适当地建立索引能够大幅度地提升SQL语句查询速度,然而并不是在什么情况下都适合建立索引,下面来谈一下什么情况下适合建立索引.建立什么样的索引以 ...

  8. mysql添加索引后查询先用索引吗_mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。还是查询的时候有单 独的参数查询索引?...

    满意答案 llt1711 2014.06.20 采纳率:49%    等级:9 已帮助:614人 MYSQL创建索引对索引使用方式分两种: 1 由数据库查询优化器自动判断否使用索引: 2 用户写SQL ...

  9. Mysql 数据库表中有索引为什么还是查询慢?

    问题分析 在进行数据库查询的时候,我们都知道索引可以加快数据查询的效率.但是在实际的业务场景下,经常会遇到即使在表中增加了索引,但是同样还是会出现数据查询慢的问题.这就需要具体分析数据查询慢的具体原因 ...

最新文章

  1. 在.net中运用HTMLParser解析网页的原理和方法
  2. 微软官方工具MediaCreationTool制作U盘Windows10启动盘教程
  3. 【深度学习】实战深度学习检测疟疾
  4. Java中input与output_java中的Io(input与output)操作总结(四)
  5. jenkins jboss_与JBoss Fuse,Jenkins和Nexus的持续集成
  6. 蓝桥杯 基础练习 报时助手
  7. Sendmail with Attachment script
  8. str.trim()去除空格
  9. 传统项目管理和敏捷项目管理的区别是什么?
  10. sap 双计量单位_SAP 基本计量单位更改(转载)
  11. 华理计算机专硕奖学金,华东理工大学研究生课程学习奖学金评定方法(试行)
  12. java判断闰年中闰月_闰年闰月查询表_闰月查询表_闰年查询表-万年历
  13. 边境的悍匪—机器学习实战:第九章 无监督学习任务
  14. 时值年末,年度CSDN小峯的回顾过去的2020年(推荐)
  15. 仿照京东导航条html+css
  16. 编程题:核桃的数量(求最小公倍数的问题)
  17. UOJ #141. 【UER #4】量子态的棋盘
  18. 藏书馆App基于Rainbond实现云原生DevOps的实践
  19. cdn部署php,Typecho博客全站部署腾讯云CDN教程
  20. pku_oj: W11-01 最大素数问题 (C++)

热门文章

  1. leetcode 111 --- 二叉树最小深度
  2. mysql 5.5 查询_mysql5.5数据库优化--定位慢查询
  3. mysql group_concat去重_mysql 数据库group_concat函数的一些用法
  4. 备份数据库的expdp语句_【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)...
  5. 100999凑整到万位进一_四年级数学专项练习
  6. 音频重采样有什么用_最佳音频接口基本购买指南
  7. 海底光缆——你不知道的秘密!
  8. 预测2019那些可能改变我们生活的技术
  9. 李开复:AI能在15年内取代40%~50%岗位
  10. 数风·数林 | 炉石传说中的概率(声控篇)