【说站】为什么你的数据库这么慢?
为什么你的数据库这么慢?
当你发现数据库查询特别慢的时候,并且从硬件配置、SQL优化和索引等方面都找不出原因,那你可能需要从数据库的计算引擎本身的性能找下原因。
数据库的计算引擎性能有多重要?我们可以拿汽车做个简单类比。服务器硬件配置是基础设施,相当于汽车行驶的道路,高速公路和山村土路的行驶效果肯定是不一样的;SQL的查询优化相当于驾驶水平;而数据库计算引擎就相当于汽车发动机,既是数据库性能的源动力,也是各家厂商最核心的技术壁垒。
那么,我们就从数据库计算引擎的实现技术探究下如何提高数据库性能。下图是从客户端发出一条SQL语句到结果返回给客户端的简化流程。
如果把数据库内核看成一个组织,那么优化器就位于组织的最上层,作为组织的首脑发号施令;执行器位于组织的中间,严格执行优化器下发的计划,从存储空间中读取数据进行加工处理,最终返回给客户端。
优化器
如何形象的理解优化器?以查询“知乎点赞过万的回答”为例,用户通过SQL告诉数据库“给我找出点赞过万的回答”,优化器把用户的需求转换为“如何找到点赞过万的回答”的策略和方法,即查询计划。
同一种SQL会有成千上万种不同的执行计划,而好的执行计划和差的执行计划在运行性能上会有天壤之别。
如何从成千上万种查询计划中选出最优的?早期数据库的查询优化器通常采用启发式规则进行优化RBP(Rule Based Optimization),这种优化方式不够准确,往往难以获得最优的执行计划,而基于代价的优化CBO (Cost Based Optimization)则能够针对大多数场景高效筛选出性能最好的执行计划。
因此,我们见到的高性能数据库引擎往往使用基于代价的优化器。
执行器
执行器是数据库内核最重要的部件之一。提升执行器的性能,会很大程度上提升数据库性能,因此各大数据库厂商都纷纷投入很多精力到执行器技术的研发中。
提升执行器性能的手段主要有两种技术路线,一种是向量计算(vectorized execution),另外一种是代码生成(code generation)。目前主流的数据库厂商会使用其中一种执行器优化技术,例如Snowflake使用的是向量计算,Impala使用的是代码生成, Spark两种都有使用,OushuDB使用了向量计算外加SIMD优化技术。而一些传统的数据库还未实现其中任何一种性能技术。
聪明的你可能要问了,哪种技术路线更胜一筹?关于这个问题,不少研究和论文给出了答案:两种技术侧重点不同但都可以提升性能,不同的语句也会有不同程度的性能提升,向量计算更适合并行处理数据SIMD。所以,想要在并行计算的基础上进一步提升数据库引擎性能,就可以结合并行处理数据充分利用CPU硬件指令(比如SIMD)。
SIMD
SIMD(single instruction multi-data), 即单指令多数据流,以同步的方式在同一时间内执行同一条指令。相比单指令单数据流(SISD),单指令多数据流一次性获得所有操作数进而加快了运算,特别是数据密集型运算。
如上图所示,使用标量运算一次只能执行一对数据的乘法操作,而采用SIMD乘法指令则可以一次同时执行四对数据的乘法操作。作为向量体系结构的一种,SIMD使用一条向量指令开启一组数据操作,其中数据的加载、存储以及数据计算以流水线的形式进行。
通过在国际标准数据集TPCH上的测试,我们发现OushuDB 4.x的速度比最新版本的SparkSQL 3.x快大约一个数量级。
基于以上的分析,如果从提升数据库性能的角度,我们可以采用基于代价的优化+向量计算+ SIMD的技术路径,作为提升数据库性能的首选方法。
以上就是数据库较慢的分析,希望对大家有所帮助。更多精彩内容分享:头条
相关文章
- 面试题:为什么数据库连接池不采用 IO 多路复用?
- Spring Security入门(三): 基于自定义数据库查询的认证实战
- 构建长久可持续的良性数据库生态,要有个“打持久战”的准备 | 对话沃趣科技联合创始人
- 为什么不建议把数据库部署在Docker容器内?
- mysql 为什么不能在同一个表上查询和更新详解数据库
- Mysql字段int的value为0时产生的bug详解数据库
- postgresql数据库创建、修改、删除详解数据库
- MysqL 磁盘写入策略之innodb_flush_log_at_trx_commit详解数据库
- MySQL分片技术:实现数据库水平扩展(mysql分片原理)
- Oracle 数据库修复:神奇的修复工具(oracle修复工具)
- 处理Oracle数据库中的预定义异常处理(oracle预定义异常)
- MySQL:值得信赖的数据库选择(为什么选用mysql)
- 探索Oracle数据库中触发器类型的功能(oracle触发器类型)
- 解决MySQL数据库乱码问题(mysql数据库乱码)
- 选择数据库的必要性:为什么有些情况不能选择MySQL?(不能选择mysql数据库)
- 据库Oracle实例数据库:实现数据可靠存储的首选方案.(oracle实例数)
- MongoDB胜出:探索为什么它是一款领先的数据库解决方案(mongodbwin)
- 坚定不移清除Redis缓存数据库(清空redis缓存数据库)
- 存储构建可靠的Redis数据库硬盘存储系统(支持redis的db硬盘)
- 其它Redis 极致性能的NoSQL 数据库之选(为什么要用redis不用)
- Oracle数据库技术游标的作用与必要性(oracle为什么要游标)
- 优化Oracle提升数据库运行效率的必要性(oracle为什么要优化)
- 数据库表Oracle究竟为何难以删除数据库表(Oracle为什么删不掉)
- Oracle数据库死锁一场悲剧(oracle为什么会死锁)
- 使用MySQL数据库管理数据(mysql_db_)
- MySQL数据库为什么有时不建立主键更好(mysql 不建立主键)
- 25字中文文章标题MySQL不在其中为什么不要再使用MySQL数据库(mysql不存在于)
- MySQL 数据库为什么无法显示中文(mysql不能显示汉字吗)
- 做神林神林奥尔卡中国神秘的数据库之谜(oracle中文为什么叫)
- Oracle0,开启数据库之旅的第一步(oracle0代表第一位)
- Oracle数据库的安全策略
- 浅析C#web访问mysql数据库-整理归纳总结