写点什么

【TiDB 社区智慧合集】解码 TiDB 性能谜题:让你的数据库发挥最强动力!

  • 2023-09-01
    北京
  • 本文字数:3692 字

    阅读完需:约 12 分钟

作者: Billmay 表妹原文来源:https://tidb.net/blog/17fb65bd


简介:


来自社区,回归社区。非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 68】征集 TiDB 数据库性能优化大师,你是如何优化 TiDB 数据库性能的呐? 3里提供的各种性能优化方法。这篇帖子收集整理了大家推荐的各方面 TiDB 数据库性能优化方法,欢迎各位 TiDBer 持续补充更新~

【硬件和网络优化】

【硬件和网络优化】方法 1

贡献者:@kongdom

开启 Raid 卡缓存,使机械硬盘的 IO 性能直线提升。


MegaCli64 -LDInfo -Lall -aALL # 查看 MegaCli64 -LDSetProp -WB -Lall -aAll # 有电池启用缓存 MegaCli64 -LDSetProp CachedBadBBU -Lall -aALL # 没有电池启用缓存 MegaCli64 -LDSetProp NOCachedBadBBU -Lall -aALL # 没有电池关闭缓存


注意:必须保证 Raid 卡的电池正常,否则意外断电会导致数据丢失

【硬件和网络优化】方法 2

贡献者:@tomxu

  1. 优化磁盘性能:使用高性能 SSD 硬盘以减少磁盘 I/O 延迟。

  2. 优化网络性能:使用高速网络设备和优化网络拓扑结构以降低网络延迟。

  3. 优化 CPU 和内存:确保 TiDB 集群有足够的 CPU 和内存资源,以便在高负载下保持良好的性能。

【硬件和网络优化】方法 3

贡献者:@ShawnYan

dstat 查看当前硬件资源状态

【硬件和网络优化】方法 4

贡献者:@TiDBer_ 小小

  1. 硬件优化:对硬件进行优化,升级硬件、调整硬件参数、调整系统参数、优化系统配置。

【SQL 方面优化】

【SQL 方面优化】方法 1

贡献者:@tidb 菜鸟一只

1. 先看执行计划,最简单的,看看是不是缺索引,是的话,直接加索引

2. 如果因为统计信息太旧导致执行计划异常,直接重新收集统计信息

3. 统计信息很新但是执行计划还不对,指定 hint

4.sql 执行计划都对,但是速度还是不理想,如果是 oltp 请求,改写 sql 或者联系开发修改应用逻辑 5.sql 执行计划对,但是速度无法接受,OLAP 请求,直接上 tiflash

二:如果以上都做了,性能还达不到要求,那么

:point_down:

【参数层面优化】

1. 看看是不是某些参数设置有问题,能在线修改参数的直接在线修改

2. 不能在线修改的,修改配置文件参数后 reload 集群

三、再看主机资源

1. 是不是有主机其他进程挤占主机资源

2. 看看是不是主机的参数可以优化

四、以上方法都用过了,发现性能还是达不到

1. 评估当前集群的资源利用率,不足直接向老板申请扩容

【SQL 方面优化】方法 2

贡献者:@裤衩儿飞上天

  1. 规范开发

  2. 把慢 sql 优化掉,基本能解决 80% 的数据库问题

  3. 升级硬件

【查询优化】

【查询优化】方法 1

贡献者:@coderv

可以通过分片、路由等技术来避免大量的热点数据,从而提高系统的可扩展性和可用性。在编写 SQL 语句时,应该尽量减少全表扫描,使用合适的索引来提高查询性能。比如可以使用覆盖索引、前缀索引、联合索引等技术来减少索引占用空间、提高查询效率。

【查询优化】方法 2

贡献者:@tomxu

  1. 使用索引:为经常用于查询条件和排序的列创建索引。这将有助于提高查询效率。

  2. 避免全表扫描:通过使用索引避免全表扫描。

  3. 优化复杂查询:将复杂查询分解为多个简单查询,以提高查询效率。

  4. 使用 EXPLAIN 分析查询计划:通过 EXPLAIN 命令分析查询计划,找出慢查询的原因并进行优化

  5. 避免使用子查询:尽量将子查询转换为 JOIN 查询,以提高查询效率。

【查询优化】方法 3

贡献者:@凌云 Cloud

  1. 使用合适的索引:根据查询语句的特点和数据分布情况,选择合适的单列或多列索引。对于复杂的查询,可以考虑使用覆盖索引或索引合并等技术来提高性能。

  2. 避免全表扫描:尽可能地使用索引来避免全表扫描。如果无法使用索引,可以考虑将数据划分为更小的分区或者分页查询。

  3. 使用连接查询时,避免过度连接:连接查询会增加查询的复杂度和执行时间。可以考虑使用子查询、关联子查询、EXISTS 或者 NOT EXISTS 等方式来代替连接查询。

【查询优化】方法 4

贡献者:@TiDBer_ 小小

对数据库查询语句进行优化,包括选择合适的索引、使用合适的查询语句、调整查询参数。

【查询优化】方法 5

贡献者:@Soysauce520

  1. 根据 cluster_slow_query 找到开销较大的 sql 分析优化可能性。

  2. 没有优化空间,就需要扩容。

【查询优化】方法 6

贡献者:@丝路雾雨

通过分析业务需求和 SQL 执行计划,使用合适的索引、避免全表扫描、调整 SQL 语句等方式来提高查询性能。

【统计信息优化】

【统计信息优化】方法 1

贡献者:@tomxu

  1. 更新统计信息:定期更新统计信息以帮助优化器生成更好的查询计划。

  2. 调整统计信息收集参数:根据实际情况调整统计信息收集参数以提高优化器的准确性。

【统计信息优化】方法 2

贡献者:@丝路雾雨

定期收集统计信息并更新,使用多列统计信息以优化复杂查询的执行计划。

【数据库应用优化】

【数据库应用优化】方法 1

贡献者:@Jellybean

如何通过应用程序的调整和优化来提高数据库性能?包括缓存、分表、批量操作等优化方法

1. 程序里面 select 语句必须指定要选择的列,不允许 select * 用法,做好上线和测试工作

2. 对于批量 insert 场景,必须开启批量提交,客户端和服务端参数都好调整

3. 对于批量 update 和 delete 场景,提前和业务沟通,尽量减少此类批量操作,转而通过 replace 扥方式或业务优化调整

4. 对于有大量数据存储和有时限的表,我们也不建议分表,而且使用分区表,对过期的数据直接通过高效的删分区方式完成,而不是低效的批量 delete 方式

5. 对于高频访问的只有几千行的小型表,设置为缓存表,可以将每秒过万的 select 延迟从 5ms 下降到 1ms 左右 6. 对于有大量中间计算结果需要复用的应用,我们使用内存临时表实现

【数据库应用优化】方法 2

贡献者:@tomxu

  1. 分页查询优化:使用 LIMIT 和 OFFSET 进行分页查询时,尽量避免使用较大的 OFFSET,以降低查询延迟。

  2. 合理使用事务:减少长事务,避免大量行锁争用。

  3. 减少连接数:通过连接池复用数据库连接,避免过多的数据库连接导致资源竞争。

  4. 批量操作:针对大量的 INSERT、UPDATE、DELETE 操作,可以使用批量操作来提高性能。

【数据库应用优化】方法 3

贡献者:@丝路雾雨

利用缓存技术减少对数据库的访问,采用分表策略解决单表过大的问题,使用批量操作减少数据库交互次数。

【TiDB 集群优化】

贡献者:@tomxu

  1. 扩展集群:按需添加更多的 TiDB、TiKV 和 PD 节点,实现集群的水平扩展。

  2. 调整 TiKV 参数:根据实际负载情况调整 TiKV 的参数,如 raftstore.store-pool-sizerocksdb.max-background-jobs 等。

  3. 调整 PD 参数:根据实际负载情况调整 PD 的参数,如 scheduler.limit 等。

【更多优化方法】

方法 1

贡献者:@TiCQ

【硬优化】硬件优化一般不可主导,每个业务都尽最大建议给 ” 能力之内 ” 的配置!【软优化】读写优化 90% 在 SQL 层面,使用常规 SQL 优化方法进行相关优化处理;再配合数据库系统优化参数进行设置调优。

方法 2

贡献者:@老田牛

如果能找到性能问题出现在哪个地方就已经成功一半了。比如 SQL 慢的问题,如果能确定单次执行慢? 还是大量类似的语句超常规执行造成整体的操作系统慢? 如果确定是单个 SQL 慢,那么执行计划是否合理?慢在 IO 还是 CPU?是缺少索引还是统计信息的问题?如果是 IO 问题, 如何收集系统的 IO 数据?是否单个磁盘 IO 慢还是整个系统 IO 慢?是否有硬件报警?

方法 3

贡献者:@张雨齐 0720

不同问题不同优化手段吧。慢 SQL 那就优化 SQL,系统参数设置不当就调整参数,其实应该要具体问题具体分析。不过大部分第一件时间是捞资源使用情况和慢 SQL

方法 4

贡献者:@db_user

初始配置先从 analyze 收集的时间段,慢 sql, 不适合的表结构方面优化,都做好了后还慢的话就从硬件瓶颈上来看了

方法 5

贡献者:@xfworld

把 tidb 提供的 dashboard 用好,就能解决很多 top 级别的问题然后在通过 grafana 检测和排查一些重要的指标,可以从更深度的计算、网络、资源调度方面做优化

方法 6

贡献者:@半瓶醋仙

1 评估业务性质, 查询优化:添加索引,数据分片降低查询复杂度,统计信息优化:配置实时更新。

2 硬件和网络优化:在线运维 dashboard 和 grafana 打开看磁盘 io,cpu , 内存网络流量,TiDB 集群优化:刷参数配置脚本。

3 数据库应用优化:每日 DBA 巡检日志对比,加载 api 插件。

方法 7

贡献者:@bert

原则上, 性能优化也是按需按目标执行,执行 pdca 的过程。分为硬件和软件优化,有如下建议:

  1. 评估当前系统性能。tiup 已经集成了 tpcc,tpch,ycsh,ch 四种测试工具集,使用其进行测试得到系统的基础数据。

  2. 选择适合的 tidb 架构,考虑 tidb 和 tiflash 的组合,节点数的配置。硬件的选择等。

  3. 优化应用的数据类型和索引。

  4. 能批量的操作尽量批量操作,能压缩的压缩,能分区的分区存储。

  5. 管理库的统计信息,合理安排统计信息收集时间,调成平行数量。

  6. 监控日常的软硬件性能,如 CPU、内存、磁盘 I/O、网络等。根据监控结果调整数据库参数、优化数据类型和索引等,以提高性能。

  7. 定期检查和升级 TiDB 数据库软件和硬件,确保其处于最新状态,可以提高性能和稳定性。

方法 8

贡献者:@清风明月

1. 版本信息 select tidb_version();

2. 查看数据库 show databases;

3. 创建数据库 create database tidb;

4. 进入数据库 user tidb;

5. 查看表 show tables;

6. 链接查询 show processlist;

7. 开启角色 set role all;

8. 查看角色 select current_role();

9. 查看授权 show grants;


发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
【TiDB 社区智慧合集】解码 TiDB 性能谜题:让你的数据库发挥最强动力!_TiDB 社区干货传送门_InfoQ写作社区