当前位置: 首页 > news >正文

基于AI+数据驱动的慢查询索引推荐

目前,美团内部每天产生的慢查询数量已经超过上亿条。如何高效准确地为慢查询推荐缺失的索引来改善其执行性能,是美团数据库研发中心面临的一项挑战。为此,我们与华东师范大学开展了科研合作,在AI领域对索引推荐进行了探索和实践,并将基于代价的方法和新提出的基于AI+数据驱动的方法共同应用于慢查询的索引推荐,成功提升了推荐效果。

  • 1 背景

  • 2 索引推荐介绍

    • 2.1 基于代价的索引推荐

    • 2.2 基于AI+数据驱动的索引推荐

  • 3 整体架构

    • 3.1 模型训练

    • 3.2 模型部署

  • 4 建模过程

    • 4.1 生成候选索引

    • 4.2 特征工程

    • 4.3 建模举例

    • 4.4 模型预测和索引评估

  • 5 项目运行情况

  • 6 未来规划

 1 背景 

随着美团业务量的不断增长,慢查询的数量也日益增多。目前,日均慢查询数量已经超过上亿条,如果仅依靠DBA和开发人员手动地对这些慢查询进行分析并建立合适的索引,显然是不太现实的。为了解决这一难题,美团内部DAS(数据库自治服务)平台已经集成了基于代价的慢查询优化建议来自动地为慢查询推荐索引。然而,仍然存在一些问题:

  • 基于代价的慢查询优化建议是借助于优化器的代价估计,来推荐出对于查询代价改善最大的索引,但优化器的代价估计并不是完全准确[1],因此可能存在着漏选或者错选推荐索引的问题。

  • 基于代价的慢查询优化建议需要计算查询在不同索引下查询代价的改善程度,因此需要进行大量的增删索引操作,但真实增删索引的代价是非常大的,需要借助于假索引[2]技术,假索引技术并不创建真实的物理索引文件,只是通过模拟索引存在时的查询计划来估算索引对于查询的收益。目前,美团大部分业务都是运行在MySQL实例上的,不同于商业数据库SQL Server和开源数据库PostgreSQL,MySQL内部并没有集成假索引技术,因此需要自己构建支持假索引的存储引擎,其开发成本较高,这也是目前DAS平台基于代价的慢查询优化建议所采用的方案。

为了解决上述两个问题,美团数据库研发中心与华东师范大学数据科学与工程学院展开了《基于数据驱动的索引推荐》的科研合作,双方通过在DAS平台上集成基于AI+数据驱动的索引推荐,来与基于代价的方法并行地为慢查询推荐索引,以提升推荐效果。

  • 首先,基于代价的方法每天会为慢查询推荐索引,并在采样库上评估推荐的索引是否真正地改善了查询的执行时间,这为AI方法积累了大量可信的训练数据,根据此数据训练的AI模型,可以在一定程度上弥补基于代价的方法漏选或错选索引的问题。

  • 其次,基于AI的方法将针对慢查询的索引推荐看作是二分类问题,通过分类模型直接判别在某一列或某些列上建立索引是否能够改善查询的执行性能,并不借助于查询优化器和假索引技术,这使得AI方法更加通用,且开发成本更低。

 2 索引推荐介绍 

索引推荐可以划分为两个级别:Workload级别和Query级别:

  • 在Workoad级别,索引推荐是在限制的索引存储空间或索引个数下,推荐出一组最优的索引集合来使得整个Worklaod的代价最低。

  • Query级别的索引推荐可以被视为Workload级别索引推荐的简化版本,在Query级别,索引推荐是为单个慢查询推荐缺失的索引,以改善其性能。

| 2.1 基于代价的索引推荐

基于代价的索引推荐[3]大多聚焦于Workload级别的索引推荐,出现在查询中每一列或者列的组合都可以看作是一个能够改善Workload代价的候选索引,所有的候选索引构成了一个巨大的搜索空间(候选索引集合)。

 这是一个属于NP-hard范畴的搜索问题[4]。目前,基于代价的索引推荐方法大多会采用“贪心策略”来简化搜索过程,但这可能会导致最后推荐出的索引是次优解[5]。

| 2.2 基于AI+数据驱动的索引推荐

基于AI+数据驱动的索引推荐聚焦于Query级别的索引推荐,出发点是在某个数据库中因为缺失索引导致的慢查询,在其它数据库中可能有相似的索引创建案例:这些查询语句相似,因此在相似位置上的列创建索引也可能带来类似的收益。例如下图中,查询和在语句结构和列类型上非常相似。因此,我们可以通过学习查询的索引创建模式来为查询 推荐缺失的索引。

8c208d389a6727649d3f8f2bb72285b0.png

对于不同列数的索引推荐,我们会分别训练基于XGBoost的二分类模型。例如,我们目前最高支持三列的索引推荐,因此会分别训练一个单列索引推荐模型、一个两列索引推荐模型和一个三列索引推荐模型。对于给定的一个单列候选索引和它对应的慢查询,我们使用单列索引推荐模型来判断该单列候选索引是否能够改善该慢查询的性能。

同样的,对于给定的一个两列(三列)候选索引和它对应的慢查询,我们使用两列(三列)索引推荐模型来判断这个两列(三列)候选索引是否能够改善该慢查询的性能。如果一条慢查询中包含的候选索引个数为,那么则需要次模型预测来完成对这条慢查询的索引推荐。

 3 整体架构 

基于AI+数据驱动的索引推荐的整体架构如下图所示,主要分为两个部分:模型训练和模型部署。

de55b937254343f31d607e22d1977088.png

| 3.1 模型训练

如上文所述,我们收集DAS平台基于代价的慢查询优化建议每天的索引推荐数据(包括慢查询和被验证有效的推荐索引)作为训练数据。我们生成每条查询的单列、两列和三列候选索引,并通过特征工程来为每个候选索引构建特征向量,使用索引数据来为特征向量打标签。之后,单列、两列和三列特征向量将分别用于训练单列、两列和三列索引推荐模型。

| 3.2 模型部署

针对需要推荐索引的慢查询,我们同样生成候选索引并构建特征向量。接下来,我们使用分类模型来预测特征向量的标签,即预测出候选索引中的有效索引。随后,我们在采样库上创建模型预测出的有效索引,并通过实际执行查询来观察建立索引前后查询性能是否得到改善。只有当查询性能真正得到改善时,我们才会将索引推荐给用户。

 4 建模过程 

| 4.1 生成候选索引

我们提取查询中出现在聚合函数、WHERE、JOIN、ORDER BY、GROUP BY这些关键词中的列作为单列候选索引,并对这些单列候选索引进行排列组合来生成两列和三列候选索引。同时,我们会获取查询所涉及的表中已经存在的索引,并将其从候选索引集合中删除。这一步骤遵循索引的最左前缀原则:如果存在索引,那么候选索引 和 都将从候选索引集合中删除。

| 4.2 特征工程

一个候选索引的特征向量包括语句特征和统计特征两部分。语句特征描述了候选索引列在查询中的出现位置(采用one-hot的编码方式),统计特征描述了候选索引列的统计信息,如所在表的表行数、Cardinality值、选择率等,这些是判断是否需要在候选索引列上建立索引的重要指标。

下表以单列候选索引 为例,展示了它的部分重要特征及其含义:

e5105feb6f6b10ec612b3e52a3ba7c32.png

两列候选索引 的特征是通过对单列候选索引 和 的特征进行拼接而成的,此外,我们还会计算 和 共同的Cardinality值作为两列候选索引 的额外统计特征,以更加全面地描述其统计信息。同样地,我们也会采用使用这种方式来构建三列候选索引 的特征。在生成完一条查询的特征向量之后,我们使用这条查询使用到的索引来为生成的特征向量打标签。

| 4.3 建模举例

下图以查询 为例,展示我们为训练集中的一条查询生成特征向量并打标签的过程。查询 涉及两张表customer表和warehouse表,其中customer表的c_w_id、c_id、c_d_id、c_last四列参与到查询中,因此对应生成四条单列特征向量;warehouse表的w_id列参与到查询中,因此只生成了一条单列特征向量。查询 使用的单列索引为Idx(w_id),所以单列候选索引 (w_id) 对应的特征向量被标记为正样本,其余特征向量则被标记为负样本。

接下来,我们对单列候选索引进行排列组合来生成多列候选索引及其特征向量。由于查询 使用到的多列索引只有一个三列索引Idx(c_d_id, c_id, c_last),因此我们跳过生成两列候选索引,只生成三列候选索引。这是因为我们是基于查询使用到的索引来为特征向量打标签的,如果查询没有使用到两列索引,那么生成的所有两列特征向量均为负样本,这可能会导致训练集正负样本不均衡的问题。

最后,基于查询使用到的三列索引,我们将三列候选索引 (c_d_id, c_id, c_last) 对应的特征向量标记为正样本。以上就是我们为查询 生成特征向量并打标签的整个过程,查询 为单列索引推荐模型的训练集贡献了五条样本(一条正样本,四条负样本),为三列索引推荐模型的训练集贡献了六条样本(一条正样本,五条负样本)。

15a6a522b9ca888219ba92a181df0522.png

| 4.4 模型预测和索引评估

在为一条慢查询推荐索引时,我们依次生成慢查询中所有的单列、双列和三列候选索引,并通过上述的特征工程来构造特征向量。然后,我们将特征向量输入给对应的分类模型进行预测,并从三个分类模型的预测结果中分别挑选出一个预测概率最高的候选索引(即一个单列索引、一个两列索引和一个三列索引)作为模型推荐的索引。

虽然推荐的索引越多,慢查询的性能就越有可能得到改善,但是模型推荐的部分索引可能是无效的,这些无效索引带来的存储空间开销和更新索引的开销是不可忽视的。因此,直接将模型推荐的索引全部推荐给用户是不合理的。为此,在将索引推荐给用户之前,我们会首先将三个分类模型推荐的索引建立在采样库上进行验证,采样库是线上数据库的一个mini版本,它抽取了线上数据库的部分数据。在采样库上,我们会观察在建立推荐的索引之后,查询的执行时间是否得到改善。如果得到改善,我们就把查询使用到的一个或多个模型推荐的索引作为索引建议推荐给用户。

 5 项目运行情况 

正如前文所述,美团DAS平台目前采用代价方法和AI模型并行为慢查询推荐索引。具体来说,AI模型可以在某些场景下,弥补代价方法漏选或错选推荐索引的问题。就在刚过去的3月份,在代价方法推荐索引的基础上,AI模型有额外12.16%的推荐索引被用户所采纳。

51944a3ca535d599fd07e28b5d932136.png

这些额外补充的索引对于查询的改善情况如上图所示:上半部分展示了优化的查询执行次数,下半部分展示了查询在使用推荐的索引之后的执行时间以及减少的执行时间,这些索引总计约优化了52亿次的查询执行,减少了4632小时的执行时间。

 6 未来规划 

目前,大模型技术(如GPT-4)已经得到了越来越多的认可,几乎可以胜任各种领域的任务。我们计划尝试通过Fine-Tune开源的大型语言模型(如Google开源的T5模型)来解决索引推荐的问题:输入一条慢查询,让模型来生成针对慢查询的索引建议。

在推荐索引无法改善慢查询的情况下,后续我们可以提供一些文本建议来帮助用户优化SQL,比如减少返回不必要的列,使用JOIN代替子查询等。

 7 本文作者 

彭淦,美团基础研发平台工程师,主要负责美团数据库自治服务DAS的SQL优化建议工作。

 8 特别感谢 

在这里特别感谢华东师范大学数据科学与工程学院的蔡鹏教授,教授在VLDB、ICDE、SIGIR、ACL等领域重要国际会议上发表多篇论文。目前的研究方向为内存事务处理,以及基于机器学习技术的自适应数据管理系统。本文也是美团数据库研发中心跟蔡鹏教授展开科研合作后的具体实践。

美团科研合作致力于搭建美团技术团队与高校、科研机构、智库的合作桥梁和平台,依托美团丰富的业务场景、数据资源和真实的产业问题,开放创新,汇聚向上的力量,围绕机器人、人工智能、大数据、物联网、无人驾驶、运筹优化等领域,共同探索前沿科技和产业焦点宏观问题,促进产学研合作交流和成果转化,推动优秀人才培养。面向未来,我们期待能与更多高校和科研院所的老师和同学们进行合作。欢迎老师和同学们发送邮件至:meituan.oi@meituan.com。

 9 参考文献 

  • [1] Leis V, Gubichev A, Mirchev A, et al. 2015. How good are query optimizers, really? Proc. VLDB Endow. 9, 3 (2015), 204-215.

  • [2] https://github.com/HypoPG/hypopg

  • [3] Kossmann J, Halfpap S, Jankrift M, et al. 2020. Magic mirror in my hand, which is the best in the land? an experimental evaluation of index selection algorithms. Proc. VLDB Endow. 13,12 (2020), 2382-2395.

  • [4] Piatetsky-Shapiro G. 1983. The optimal selection of secondary indices is NP-complete. SIGMOD Record. 13,2 (1983), 72-75.

  • [5] Zhou X, Liu L, Li W, et al. 2022. Autoindex: An incremental index management system for dynamic workloads.  In ICDE. 2196-2208.

----------  END  ----------

 推荐阅读 

  | 基于代价的慢查询优化建议

  | 基于AI算法的数据库异常监测系统的设计与实现

  | 数据库异常智能分析与诊断

相关文章:

基于AI+数据驱动的慢查询索引推荐

目前,美团内部每天产生的慢查询数量已经超过上亿条。如何高效准确地为慢查询推荐缺失的索引来改善其执行性能,是美团数据库研发中心面临的一项挑战。为此,我们与华东师范大学开展了科研合作,在AI领域对索引推荐进行了探索和实践&a…...

【ESP32】嵌入式FreeRtos--Task

FreeRTOS中文数据手册:https://www.freertos.org/zh-cn-cmn-s/RTOS.html 任务函数 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreateStatic()使用静态的方法创建一个任务xTaskCreatePinnedToCore指定任务运行的核心(最后一个参数)vTaskDelete()删…...

【操作系统】面试官都爱问的进程调度算法

【操作系统】面试官都爱问的进程调度算法 文章目录【操作系统】面试官都爱问的进程调度算法先来先服务调度算法最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法最高优先级调度算法多级反馈队列调度算法进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU…...

Spring-Web spi机制解析

org.springframework.web.SpringServletContainerInitializer#onStartup 在这里打个断点,查看程序是否会进来 可以发现程序进来了:主要spi机制,看看这里做了什么操作? 去寻找所有实现了WebApplicationInitializer的类 将符合条件…...

数据结构|将链表中小于0的数全部放在大于0的数的前面

题1: 某带头结点的非空单链表L中所有元素为整数,结点类型定义如下: typedef struct node { int data; struct node *next; } LinkNode; 设计一个尽可能高效的算法,将所有小于零的结点移到所有大于等于零的结点的前面。 分…...

分享106个ASP影音娱乐源码,总有一款适合您

分享106个ASP影音娱乐源码,总有一款适合您 106个ASP影音娱乐源码下载链接:https://pan.baidu.com/s/13k8UaJrCci_z4Q0gQbtDtg?pwdjq44 提取码:jq44 Python采集代码下载链接:采集代码.zip - 蓝奏云 我的博客地址:亚…...

win10 PyCharm Anaconda过程记录

1、Anaconda用来配置不同的虚拟环境 进入 Anaconda Prompt 输入conda activate Hui(此为自己创建的放置虚拟环境的文件夹) 编译运行过程中出现No module named seaborn后 pip install seaborn...

Chrome扩展程序导出备份与本地导入浏览器

现在即使在国内下载个chrome,转个插件也千难万难。现在科学上网也越来越难,由于众所周知的原因,连qiang这个话题都是敏感词。哀默于心死,还是回避这个话题 只要把之前装的chrome打包,然后再重新安装一遍。操作步骤如下…...

mysql常用运算符

mysql常用运算符一、去重和空值1.distinct2.null参与运算3.用ifnull函数解决问题二、比较运算符三、dual伪表和数值运算1.常规运算2.比较运算符3.<>安全相等四、常用正则相关的比较运算符1.基本运算符2.模糊查询3.正则表达式五、逻辑运算符六、位运算总结一、去重和空值 …...

PyTorch 深度学习框架:优雅而简洁的代码实现

PyTorch 是由 Facebook 发布的深度学习框架&#xff0c;旨在为研究人员和工程师提供快速、灵活和简单的实验平台。与其他框架相比&#xff0c;PyTorch 具有简洁的 API 和灵活的动态计算图&#xff0c;使得构建和训练深度神经网络变得更加优雅和简洁。本文将介绍 PyTorch 的基本…...

【SpringMVC】请求重定向和转发

forward&#xff1a;表示转发 处理器方法返回ModelAndView,实现转发forward 语法&#xff1a; setViewName("forward:视图文件完整路径") forward特点&#xff1a; 不和视图解析器一同使用&#xff0c;就当项目中没有视图解析器redirect&#xff1a;表示重定向 处理…...

Vue中@click的常见修饰符

在 Vue 的click事件中&#xff0c;可以使用以下修饰符&#xff1a; .stop&#xff1a;阻止事件继续传播。.prevent&#xff1a;阻止默认事件。.capture&#xff1a;使用事件捕获模式。.self&#xff1a;只当事件是从侦听器绑定的元素本身触发时才触发回调。.once&#xff1a;只…...

软件测试面试复盘:技术面没有难倒我,hr面被虐的体无完肤

一般提到面试&#xff0c;肯定都会想问一下面试结果&#xff0c;我就大概的说一下面试结果&#xff0c;哈哈&#xff0c;其实不太想说&#xff0c;因为挺惨的&#xff0c;并没有像很多大佬一样 ”已拿字节阿里腾讯各大厂offer”&#xff0c;但是毕竟是自己的经历&#xff0c;无…...

vue实现鼠标移入移出事件+解决鼠标事件没有反应

鼠标移入移出事件代码 <div mouseenter"onMouseOver(item)" mouseleave"onMouseOut"></div> methods methods:{// 鼠标移入onMouseOver(item){console.log(item, 鼠标进来了);},// 鼠标移出onMouseOut(){console.log(鼠标出去了);}, }, 这…...

右键移动文件.cmd

REM xcopy /yis %1% % % %D:\test\% REM https://zhuanlan.zhihu.com/p/38330443 不能移动文件夹 不知道为什么 xcopy&#xff08;拷贝目录文件、目录结构的指令&#xff09;_尚可名片 写了个JAVA程序&#xff0c;怎样实现在win选中文件后&#xff0c;右键发送到我的程序&am…...

web基础

web基础 与http 域名&#xff1a;由于IP地址不易记忆&#xff0c;域名用来代替IP地址&#xff0c; &#xff08;DNS&#xff09;服务与配置&#xff1a;先在本地hosts里去找&#xff0c;然后在本地域名服务器递归查找&#xff0c;本地域名服务器在一级二级按域名长度迭代查找后…...

牛客网算法八股刷题系列(七)正则化(软间隔SVM再回首)

牛客网算法八股刷题系列——正则化[软间隔SVM再回首]题目描述正确答案&#xff1a;C\mathcal CC题目解析开端&#xff1a;关于函数间隔问题解释的补充软间隔SVM\text{SVM}SVMHinge\text{Hinge}Hinge损失函数支持向量机的正则化题目描述 关于支持向量机(Support Vector Machine…...

开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门

一、理论知识准备 您需要对微信小程序开发有所了解&#xff1a; 1&#xff09;真正零基础入门学习笔记系列2&#xff09;从零开始的微信小程序入门教程3&#xff09;最全教程&#xff1a;微信小程序开发入门详解 您需要对WebSocket技术有所了解&#xff1a; 1&#xff09;新…...

【C++从0到1】11、C++中赋值运算

C从0到1全系列教程 1、赋值运算 运算符示例描述c a b;将把a b的值赋给c。 把右边操作数的值赋给左边操作数。c a;相当于 c c a; 加且赋值运算符&#xff0c;把右边操作数加上左边操作数的结果赋值给左边操作数。-c - a;相当于 c c - a; 减且赋值运算符&#xff0c;把左…...

GaussDB数据库事务介绍

目录 一、前言 二、GaussDB事务的定义及应用场景 三、GaussDB事务的管理 四、GaussDB事务语句 五、GaussDB事务隔离 六、GaussDB事务监控 七、总结 一、前言 随着大数据和互联网技术的不断发展&#xff0c;数据库管理系统的作用越来越重要&#xff0c;实现数据的快速读…...

MYSQL——美团面试题

MYSQL——美团面试题 2023/3/27 美团二面 题目描述 Create table If Not Exists courses (student varchar(255), class varchar(255));insert into courses (student, class) values (A, Math); insert into courses (student, class) values (B, English); insert into co…...

Python 小型项目大全 16~20

#16 钻石 原文&#xff1a;http://inventwithpython.com/bigbookpython/project16.html 这个程序的特点是一个小算法&#xff0c;用于绘制各种尺寸的 ASCII 艺术画钻石。它包含绘制轮廓或你指定大小的填充式菱形的功能。这些功能对于初学者来说是很好的练习&#xff1b;试着理解…...

UE4/5C++之SubSystem的了解与创建

目录 了解生命周期 为什么用他&#xff0c;简单讲解&#xff1f; SubSystems创建和使用 创建SubSystems中的UGamelnstanceSubsystem类&#xff1a; 写基本的3个函数&#xff1a; 在蓝图中的样子&#xff1a; 创建SubSystems中的UEditorSubsystem类&#xff1a; SubSyste…...

牛客网在线编程SQL篇非技术快速入门题解(二)

大家好&#xff0c;我是RecordLiu。 初学SQL,有哪些合适的练习网站推荐呢? 如果你有编程基础&#xff0c;那么我推荐你到Leetcode这样的专业算法刷题网站&#xff0c;如果没有&#xff0c;也不要紧&#xff0c;你也可以到像牛客网一样的编程网站去练习。 牛客网有很多面向非技…...

航天器轨道六要素和TLE两行轨道数据格式

航天器轨道要素 椭圆轨道六根数指的是&#xff1a;半长轴aaa&#xff0c;离心率e&#xff0c;轨道倾角iii、升交点赤经Ω\OmegaΩ、近地点辐角ω\omegaω、和过近地点时刻t0t_0t0​&#xff08;或真近点角φ&#xff09;。 决定轨道形状&#xff1a; 轨道半长轴aaa&#xff1…...

【Spring Cloud Alibaba】第01节 - 课程介绍

一、Spring Cloud Alibaba 阿里巴巴公司 以Spring Cloud的衍生微服务一站式解决方案 二、学习Spring Cloud Alibaba的原因 Spring Cloud 多项组件宣布闭源或停止维护Spring Cloud Alibaba 性能优于Spring Cloud 三、适应群体 有Java编程和SpringBoot基础&#xff0c;最好有Sp…...

iOS和Android手机浏览器链接打开app store或应用市场下载软件讲解

引言当开发一个app出来后&#xff0c;通过分享引流用户去打开/下载该app软件&#xff0c;不同手机下载的地方不一样&#xff0c;比如&#xff1a;ios需要到苹果商店去下载&#xff0c;Android手机需要到各个不同的应用商店去下载(华为手机需要到华为应用商店下载&#xff0c;vi…...

2023第十四届蓝桥杯省赛java B组

试题 A: 阶乘求和 本题总分&#xff1a;5 分 【问题描述】 令 S 1! 2! 3! ... 202320232023!&#xff0c;求 S 的末尾 9 位数字。 提示&#xff1a;答案首位不为 0。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一 个整数…...

windows下如何快速搜索文件内容

安装git&#xff0c;使用linux命令 grep 这里不再多说 windows版本的命令 Windows提供find/findstr类似命令&#xff0c;其中findstr要比find功能更多一些&#xff0c;可以/?查看帮助。...

Redis集群分片

文章目录1、Redis集群的基本概念2、浅析集群算法-分片-槽位slot2.1 Redis集群的槽位slot2.2 Redis集群的分片2.3 两大优势2.4 如何进行slot槽位映射2.5 为什么redis集群的最大槽数是16384个&#xff1f;2.6 Redis集群不保证强一致性3、集群环境搭建3.1 主从容错切换迁移3.2 主从…...