SQL优化是通过改进数据库性能,提高系统响应速度和效率的过程。通过精心规划数据库结构、避免不必要的查询和合理分配资源,可以降低数据库负载,提高系统性能。SQL优化的目标是提供更快的查询响应时间,降低系统开销,并确保数据库能够有效地应对大量数据和用户需求。
什么是SQL优化
SQL 是用户使用数据库的常用方式,我们可以通过 SQL 实现数据的定义、存储、更新、查询等所有数据的管理操作。它是一种高度非过程化的编程语言,用户只需要提出“干什么”,无须具体指明“怎么干”,不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式。SQL 更像是一种偏“口语化”的编程语言,就和我们平时说话一样,有主谓宾的层次结构。
举个例子,我们去图书馆借书,跟图书管理员说“我要一本数据库指南”,SQL 语句就是 select * from book where book_name='数据库指南'。图书管理员需要提前对所有图书进行分类和排序,等想要拿书的时候就非常方便了。反之,如果图书入库的时候只是随便堆放,在书本少的时候或许还能应付,否则将是大海捞针一样效率极低。 “分类、排序”的管理方法就是数据库 SCHEMA 的索引结构,高效合理的索引设计对于 SQL 性能来说至关重要。我们常说的 SQL 优化,最核心的就是怎么减少 SQL 执行时扫描的数据量,即是 SQL 索引优化。详情参考SQL优化体现的文档。
SQL优化典型场景和案例
SQL 优化基本上是指调优 SQL 的执行计划,设计良好的索引组合,减少数据扫描行数是最有效的调优手段。除此之外,SQL 优化与应用和数据库的优化都密不可分。SQL 调优的宏观概念是寻找“应用通过 SQL 请求从数据库中获取数据”的最佳实践。单纯针对一条 SQL 语句,我们能做的优化策略并不多,例如优化一条没有任何过滤条件的 SQL 根本无从下手,我们可能会产生疑问“这条 SQL 真的有必要吗”。详情参考SQL优化典型场景和案例。
MySQL优化常见问题
1.代价模型缺陷导致的执行计划选择错误
OceanBase 数据库内建的代价模型是服务器的固有逻辑,最佳的执行计划依赖此代价模型。因此,一旦出现由代价模型导致的计划选择错误,用户只能通过执行计划绑定来确保选择"正确"的执行计划。
2.数据统计信息不准确
查询优化过程依赖数据统计信息的准确性,OceanBase 数据库的优化器默认会在数据合并过程中收集一些统计信息,当用对数据进行了大量修改时,可能会导致统计信息落后于真实数据的特征,用户可以通过发起每日合并,主动更新统计信息。
除了优化器收集的统计信息以外,优化器还会根据查询条件对存储层进行采样,用以后续的优化选择。OceanBase 数据库目前仅支持对本地存储进行采样,对于数据分区在远程节点上的情况,只能使用默认收集的统计信息进行代价估计,可能会引入代价偏差。
3.数据库物理设计降低查询性能
查询的性能很大程度上取决于数据库的物理设计,包括所访问对象的 Schema 信息等。例如,对于二级索引,如果所需的投影列没有包括在索引列之中,则需要使用回表的机制访问主表,查询的代价会增加很多。此时,可以考虑将用户的投影列加入到索引列中,构成所谓的"覆盖索引",避免回表访问。详情参考SQL优化常见问题。
SQL优化相关文章
TPC-C 解析系列 | TPC-C基准测试之SQL优化
因为 TPC-C 的设计原则是尽可能的“真实”反应一个 OLTP 系统的运行场景,我们所做的很多优化都具有广泛的适用性。例如,对于一个高并发的 OLTP 系统来说,大部分的 SQL 请求的耗时是非常短的,采用纯粹的 C/S 交互模型的后果必然使系统的时间浪费在应用与数据库的频繁交互中,而使用存储过程可以大大缓解这种交互的耗时,并且增强系统对于网络抖动的免疫力,这种核心能力对于一个分布式 OLTP 数据库是不可或缺的。
OceanBase 从创立伊始就坚持走自主研发的道路,这个选择确保了我们对数据库内核有着完全的掌控能力,让我们有在任何场景下追求极致性能的底气和实力的同时,也对产品形态的发展方向有更清晰的规划和目标。在这次的 TPC-C 测试中,我们采用了 OceanBase 2.0 版本开始支持的 Oracle 兼容模式,存储过程和 SQL 全部使用了兼容 Oracle 的数据类型和语法,这样做也是为了在追求极致优化的同时,确保产品迭代可以沿着通用和正规的方向发展。
从 OceanBase 2.0 版本开始,OceanBase 就不断朝着 Oracle 兼容这个大的目标前进,随着 2.2 版本支持的存储过程(PL/SQL)功能的完善,我们的产品功能也完成了一轮新的迭代。我们坚信这次的 TPC-C 测试结果不仅仅见证了 OceanBase 的极致性能,也将成为 OceanBase 数据库走向成熟产品的一个新起点。
十年磨一剑!OceanBase查询优化器的设计之道和工程实践哲学
查询优化器是关系数据库系统的核心模块,是数据库内核开发的重点和难点,也是衡量整个数据库系统成熟度的“试金石”。查询优化理论诞生距今已有四十来年,学术界和工业界其实已经形成了一套比较完善的查询优化框架(System-R的Bottom-up优化框架和Volcano/Cascade的Top-down优化框架),但围绕查询优化的核心难题始终没变——如何利用有限的系统资源尽可能为查询选择一个“好”的执行计划。
一个提升 OB 本地索引性能的 SQL 优化案例
通过一个案例了解Oracle迁移Oceanbase时如何选择全局索引和本地索引。这个问题中 OB 集群是非分布式架构(指定了一个 primary zone),全局索引不会带来分布式事务问题。SQL 无法做分区裁剪时,使用了高效的唯一索引,当索引是全局索引时效率最高;当索引是本地索引时,需要访问所有的索引分区,性能会下降。
SQL优化相关产品
OceanBase运维管理工具(OCP)
OceanBase 运维管理工具(OceanBase Control Platform,OCP)是一款为 OceanBase 数据库集群量身打造的企业级管理平台,兼容 OceanBase 所有主流版本。OCP 提供对 OceanBase 集群的图形化管理能力,包括数据库组件及相关资源的全生命周期管理、监控告警、性能诊断、故障恢复、备份恢复等,旨在协助客户更加高效地管理 OceanBase 数据库,降低企业的IT运维成本和用户的学习成本。