我的编程空间,编程开发者的网络收藏夹
学习永远不晚

数据库查询性能优化指南

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

数据库查询性能优化指南

[[379574]]

1. 什么样的环境

硬件环境

query执行的速度和我们的硬件息息相关,当前用的什么样的CPU,有多少核多少线程, 内存有多大都直接影响了运算速度, 磁盘是SSD还是HDD,网卡什么速率都直接影响了我们数据读取的时延

软件环境

软件环境虽然不像硬件一样,各种参数看的见摸得着,但仍然影响着我们的查询性能。没一套系统实际上都在特定的场景有着各自的优势。我们的查询系统是什么样的架构,适合什么样的query,在线还是离线, 计算多还是数据读取多,这些在我们做优化的时候都应该了然于心。

下面我们根据这种思路来看看如何做性能优化

2. 什么样的query

首先我们优化查询的时候,需要看看query 究竟是哪种类型。写入还是查询(这里鉴于篇幅只谈查询), CPU密集还是IO密集。如果我们的系统是适合OLTP低延时点查的场景, 想要在这种系统上做OLAP大规模分析很显然就不太适合, OLTP一般专注于数据一致性较高的点查,而OLAP由于数据量庞大,一般都需要采用向量并发查询。OLAP不专注于毫秒级的低延迟, 而OLTP不专注于上亿级的数据统计。

3. 如何寻找性能瓶颈

3.1 vmstat查看系统情况

整体系统不知道当前的瓶颈在哪里时, 我们可以先用vmstat工具来简单的看一下系统的大致情况。如下图所示,2表示每个两秒采集一次服务器状态。

 

 

 

 

procs : 查看进程状态

r : 运行队列,即当前可运行(正在运行或者等待运行)的进程数量。目前CPU比较空闲,这个数量很小,当这个值超过了CPU数目,就会出现CPU瓶颈了。

b : 阻塞的进程,即处在不可中断sleep状态下的进程数量。

memory : 查看内存状态

swpd : 已使用的虚拟内存大小,如果大于0,表示机器开始使用虚拟内存了,虚拟内存运行会很慢。这里数值为0表示我们关闭了虚拟内存功能。

free : 空闲的物理内存的大小。

buff : 内存做为系统buffers的大小。

cache : 内存做为系统cache的大小。

swap : 磁盘和内存做数据交换的状态

nesi : 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够。

so : 每秒虚拟内存写入磁盘的大小。

io:磁盘的io信息

bi : 每秒从块设备接收的块数量。

bo : 每秒发送给块设备的块数量。

如果这两个值较大,表示IO比较频繁,可以考虑IO优化。

system : 系统状态信息

in : 每秒CPU的中断次数(包括时钟中断)

cs : 每秒上下文切换次数,我们调用系统函数、线程的切换,就需要上下文切换,这个值要太大就可以考虑 减少系统的上下文切换,比如协程替代多线程等方式。

CPU : CPU信息

us : 包括用户时间和nice时间,跑非内核的代码(或者用户代码)的时间。

sy : 系统占用时间,跑内核代码(比如系统调用)占用的时间。

id : 花费在idle上的 CPU时间。

wa : 等待IO CPU时间。如果这个值太大,表示IO系统瓶颈在IO上。

如果CPU占用高表示系统在CPU上, 如果系统的swap比较频繁,很可能是系统内存泄露或者内存不够用,需要扩展内存, 如果是IO等待较多则系统瓶颈出现在IO上,如果上下文切换,或者系统调用占比太大,则我们需要思考下我们程序的设计,减少系统调用或者上下文切换。

3.2 CPU占用过高

我们可以通过uptime、top、mpstat或者sar等一些工具来查看当前CPU占用过高的情况.

我们可以通过uptime看看当前系统的整体情况, 当前的系统时间和运行时间, 登陆的用户数量,还有最近5、10和15分钟的系统平均负载。

 

top则可以显示较详细的信息。head部分有CPU占用的详细信息, 下面的列表也有记录每个进程占用的CPU情况。

 

如果是多线程, 我们还可以通过top -H -p pid来查看进程的每个线程的CPU占用情况

 

我们找到哪个线程占用的比例多之后, 可以根据这个线程的线程名查看该线程是用来做什么处理的。大致了解下是什么样的处理让CPU比较高。

 

mpstat则可以查看系统每个核的运行状态。

sar的功能比较全,这里不再做科普。

CPU用户态的占用比较高,一般就是我们的程序编写的效率太低,具体哪里低,我们可以通过perf工具或者Intel的vtunes来查看性能瓶颈。perf top的执行结果如下图所示, 我们拿到对应的堆栈信息之后, 就可以针对性的消除CPU瓶颈了。(vtune的用法可以自行谷歌)。

 

鉴于上述工具检查出来的情况, 如果CPU确实水位很高,则CPU基本就是性能瓶颈。如果不高则,需要进行下一步来判断性能瓶颈。

3.3 IO占用过高的情况

IO定位的工具多种多样, 一般查看IO问题我们可以使用iostat、pidstat和iotop工具。当然我们也可以使用其他的工具,大家可以自己搜索相关的工具使用, 这里主要介绍常用的几种工具。

pidstat

pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。用户可以通过指定统计的次数和时间来获得所需的统计信息。

 

 

 

 

我们通过这个命令可以知道哪个进程占用的IO比较多。然后我们可以通过指定进程号的方式查看更详细的信息。

 

这样我们就可以知道是哪个进程中的哪个线程占用了较多的IO资源,然后我们可以通过对应的TID,找到对应的执行代码进行分析。

iostat

iostat是I/O statistics(输入/输出统计)的缩写,它可以对系统的磁盘操作活动进行监控,汇报磁盘活动统计情况。但是iostat仅对系统的整体情况进行统计,不能对某个进程进行深入分析,单独的进程分析我们可以用iotop工具,使用方法和top类似。

 

 

 

 

1 表示每秒打印一次当前磁盘的统计信息。我们需要注意的是后面几个指标。

 

 

avgrq-sz直接反应了当前io的种类,比如大块数据读取还是小数据量的读取。

avgqu-sz反应了当前IO的繁忙情况, 如果队列长度太长,说明IO现在很忙很多任务处理不过来,换句话说 I,IO成为了瓶颈。

await 也是一样, 如果等待比较高,说明IO成了累赘。

svctm则和avgrq-sz一样,反应了IO操作的处理规模,如果是大块数据读写, 这个时间就会拉长。

iotop

iotop 可以用于查看哪些进程执行占用了的 I/O,使用方式和top类似,这里不再做过多描述。

 

 

 

 

3.4 其他情况

如果TOP占用不高, IO也不是瓶颈,则可能处在程序架构上, 比如并发控制的不够好有较多的线程在sleep状态。这种情况可以通过pstack看看当前所有线程的堆栈。

4. 优化性能瓶颈

CPU瓶颈型

面对这种类型,一般我们需要通过perf配合对应的代码去进行优化,核心思想就是减少计算的量。具体方法以下仅供参考:

  1. 多采用SIMD来代替老式的计算指令或者C++的操作运算符。可以引进类似Intel的MKL库来辅助计算。
  2. 减少不必要的重复计算,减少for循环的次数。比如有些std库的数据结构都有find函数都带有起始坐标,善用起始坐标避免从0坐标重复查询。
  3. 如果是系统调用过多,比如分配内存之类的,可以考虑预分配内存的方式,或者直接使用tcmalloc等类似的内存管理库进行兜底,有条件的可以基于这类库再开发适合自己的内存管理体系

IO瓶颈型

IO瓶颈一般都是和磁盘相关的,网络上,因为网卡升级,速度上去比较快,相比来说,限制的io基本都是磁盘上的io.下面也只说说磁盘的IO优化方法。

  1. 如果是读类型的请求造成了IO瓶颈, 可以考虑上层多开cache。比如全局的query cache, session级别的session cache, 块设备的block cache等,从上层去减少磁盘的io请求。
  2. 如果是是小数据大并发的写入类型的造成了IO瓶颈,我们可以考虑在内存做一次cache,对这多次写入先在内存处理,然后通过时间或者大小阈值等策略控制,刷到磁盘上。
  3. 如果是大数据的写入,我们可以考虑做下平滑写入,每次限制写入的数量。
  4. 如果是因为流量的关系,某一时间点出现峰值,之后回落,则可以考虑通过第三方来写入。比如消息队列,先写到消息队列i进行削峰,再平滑写入系统。
  5. 除此之外我们还可以换更好的硬件,比如磁盘阵列等。

内存瓶颈型

内存瓶颈一般比较难出现,内存毕竟比较便宜,基本上都会满足内存的需求。如果真的因为虚拟内存的问题造成了程序运行效率低下,我们一方面是考虑增加内存,关闭虚拟内存来解决,同时我们也应该思考自己的程序模型,比如减少中间数据的存在, 多用写时复制技术,多用用系统的no copy接口替换老的接口等。

5. 后续

如果实在没有方法优化了,我们真的就需要看看当前的query是否真的合适我们的系统了。还是那句话,每套系统都有适合自己的业务,一般公司的系统体系里都会有多种数据库引擎,针对我们的query,去寻找合适的引擎也是一种方法。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

数据库查询性能优化指南

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

数据库查询性能优化指南

数据库查询性能优化一直是程序员绕不开的话题,当我们遇到业务刷新报表缓慢或者查询获取结果延迟太大,可以采用提问法来思考如何进行优化。

PHP 性能优化:数据库优化指南

PHP 性能优化:数据库优化指南数据库的性能对 PHP 应用程序的整体性能至关重要。通过实施以下最佳实践,可以显著优化数据库性能:1. 索引优化创建必要的索引以加速查询。确保索引列包含 SELECT 查询中最常用的列。使用组合索引以
PHP 性能优化:数据库优化指南
2024-05-11

数据库性能优化之IN子查询优化

PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员。
PawSQL数据库2024-11-30

MySQL数据库查询性能优化策略

优化查询使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。 通过对查询语句的分析,可以了解查询语句的执行情况,找出查询语句执行的瓶颈,从而优化查询
2022-05-25

怎么优化NoSQL数据库的查询性能

要优化NoSQL数据库的查询性能,可以考虑以下几个方面:数据模型设计:设计合理的数据模型可以减少查询的复杂度,提高查询性能。可以根据实际需求对数据进行合理划分和建模。索引优化:在NoSQL数据库中,可以通过创建合适的索引来加快查询速度。确保
怎么优化NoSQL数据库的查询性能
2024-05-07

PHP 应用程序性能优化之数据库优化指南

PHP 应用程序性能优化之数据库优化指南前言数据库是 PHP 应用程序的重要组成部分,它的性能直接影响应用程序的整体性能。优化数据库可以显著提高应用程序的速度和响应能力。本文将提供详细的指南,帮助您优化 PHP 应用程序中数据库的性能。
PHP 应用程序性能优化之数据库优化指南
2024-05-01

Golang 技术性能优化中如何优化数据库查询?

优化 go 中的数据库查询可以提升技术性能。可以通过使用索引、减少查询返回字段、使用批量查询和使用连接池来实现。通过优化字段选择,可以减少查询响应的大小,提高查询速度。Go 中优化数据库查询以提升技术性能在 Go 应用中,数据库查询的性能
Golang 技术性能优化中如何优化数据库查询?
2024-05-12

PHP接口性能优化之数据库查询优化策略(如何优化PHP接口中的数据库查询以提升性能?)

优化PHP接口中的数据库查询对性能至关重要。最佳实践包括使用预处理语句、绑定参数、索引数据、优化查询结构、缓存查询结果、利用索引覆盖、减少查询数据量、使用快速数据库连接、监控查询并升级数据库软件。遵循这些策略有助于显着提升PHP接口的响应时间和吞吐量。
PHP接口性能优化之数据库查询优化策略(如何优化PHP接口中的数据库查询以提升性能?)
2024-04-02

如何通过php函数优化数据库查询性能?

数据库查询是Web开发中经常使用的功能,然而,不当的查询方式可能导致性能问题。在PHP中,我们可以通过一些函数来优化数据库查询性能,从而提高应用程序的响应速度。以下是一些优化数据库查询性能的具体代码示例。使用预处理语句预处理语句是一种将SQ
2023-10-21

如何优化 PHP 函数中数据库查询的性能?

回答:优化 php 函数中的数据库查询性能至关重要。原因:不必要的重叠查询无效的索引无效的查询语法优化技巧:使用缓存优化索引使用适当的查询类型限制结果集利用 explain使用 prepared statements优化 PHP 函数中数据
如何优化 PHP 函数中数据库查询的性能?
2024-04-24

MongoDB索引优化指南:提升查询性能的关键

本文将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来提高查询性能。

PHP中如何优化数据库查询以提高性能?

优化php中的数据库查询以提高性能,可通过以下方法:使用索引避免全表扫描。编写高效的查询,仅选择所需列并使用适当的连接和联接。使用缓冲查询存储查询结果以提高后续执行速度。限制结果集以减少查询时间和资源消耗。使用批处理组合多个查询以减少数据库
PHP中如何优化数据库查询以提高性能?
2024-05-06

PHP PDO实战技巧:优化数据库查询和性能

提供了如何通过正确的索引使用、避免数据库过度查询以及合理使用缓存等方法来优化数据库查询和性能的详细说明,希望能给读者一些启发和帮助。
PHP PDO实战技巧:优化数据库查询和性能
2024-02-13

PHP 函数性能优化指南

为了优化 php 函数性能,建议:避免不必要的函数调用。缓存函数调用结果。利用 php 内置扩展。避免传递大数组,可考虑使用引用参数或 json 字符串。通过应用这些最佳实践,可以显著提高函数调用的速度,从而提升应用程序的整体性能。PHP
PHP 函数性能优化指南
2024-04-11

MySQL中如何优化查询语句和数据库性能

MySQL中优化查询语句和数据库性能可以采取以下措施:使用合适的索引:为经常查询的列创建索引,可以加快查询速度。但要注意不要过度索引,因为索引会增加写操作的开销。避免使用SELECT :尽量避免使用SELECT ,只查询需要的列。这样可以
MySQL中如何优化查询语句和数据库性能
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录