频繁查询数据库,怎么保证整个系统的性能

频繁查询数据库,怎么保证整个系统的性能,第1张

这个有很多可以说的了以下全部手打by lcg1986:

数据库层面优化

数据库本身来优化,优化SQL语句,建立适当的索引尽量让查询条件命中索引,避免全表扫描

精简查询语句,使用select 字段,避免使用select

数据库使用主备机或者集群模式,进行读写分离

对数据进行分库分表

系统应用层面优化

系统使用连接池连接数据库,避免频繁的建立连接,释放连接的IO开销

使用缓存,根据业务场景对数据进行划分,尽量将基本不会发生改变的数据缓存下来,查询时优先查询缓存,减少对数据库的访问

对服务进行降级功能设计,在并发大到数据库实在无法处理的情况,对造成数据拥堵的服务进行降级

支持数据的读写分离读请求和写请求分别访问不同的数据库

支持分库分表,或引入数据库中间件,如Mycat

硬件方面优化

尽量使用SSD磁盘类型的数据库服务器,相比传统机械硬盘类型的服务器,具有更高的IO吞吐能力

如果可能,尽量保证系统与数据库,数据库各个机器在同一区域内避免如系统服务在北京,数据库服务器在上海的情况,减少因为网络环境,网络带宽等因素带来的影响

MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性,如果 MySQL 中包含了大量表,这个校验过程就会比较耗时。 MySQL 下崩溃恢复确实和表数量有关,表总数越大,崩溃恢复时间越长。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低,因此面对大量的表空间,校验速度就非常缓慢。另外一个发现,MySQL 8 下正常启用时居然也会进行表空间校验,而故障恢复时则会额外再进行一次表空间校验,等于校验了 2 遍。不过 MySQL 80 里多了一个特性,即表数量超过 5W 时,会启用多线程扫描,加快表空间校验过程。

如何跳过校验MySQL 57 下有方法可以跳过崩溃恢复时的表空间校验过程嘛?查阅了资料,方法主要有两种:

1 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那么 validate = false,即可以跳过表空间校验。实际测试的时候设置 innodb_force_recovery =1,也就是强制恢复跳过坏页,就可以跳过校验,然后重启就是正常启动了。通过这种临时方式可以避免崩溃恢复后非常耗时的表空间校验过程,快速启动 MySQL,个人目前暂时未发现有什么隐患。2 使用共享表空间替代独立表空间这样就不需要打开 N 个 ibd 文件了,只需要打开一个 ibdata 文件即可,大大节省了校验时间。自从听了姜老师讲过使用共享表空间替代独立表空间解决 drop 大表时性能抖动的原理后,感觉共享表空间在很多业务环境下,反而更有优势。

临时冒出另外一种解决想法,即用 GDB 调试崩溃恢复,通过临时修改 validate 变量值让 MySQL 跳过表空间验证过程,然后让 MySQL 正常关闭,重新启动就可以正常启动了。但是实际测试发现,如果以 debug 模式运行,确实可以临时修改 validate 变量,跳过表空间验证过程,但是 debug 模式下代码运行效率大打折扣,反而耗时更长。而以非 debug 模式运行,则无法修改 validate 变量,想法破灭。

肯定是有影响的,因为在插入,更新,查询时,MySQL都会有一个锁 *** 作这个是隐形的,看不到,也可以理解为一个时间结点,每一个 *** 作都有一个时间结点,你在查询时同时写入,那MySQL就不知道你有没有写入或更新,此时,MySQL会在锁定的形式,暂时将程序锁定一个状态,然后查询,之后在解锁。这样才能保证查询不出错。以上只是理论的解释。

同时还有一种IO *** 作的时效,每一个插入,更新或查询都是一个IO写和读的过程,资源是固定的,你不断的更新或插入,查询IO的时间肯定会被拉长,这样的话,就影响到了你的效率。

以上为个人见解,希望对你有帮助。

一般情况下虚拟主机都会分配一定的内存资源用于网站程序运行,有时候站长会遇到虚拟主机内存使用量过高的问题,主因其实还是在于网站程序的选择和访问情况。

几种占用内存比较多的情况

1:伪静态、动态、静态

在这三种形式中,伪静态会相对更吃虚拟主机的内存,动态次之,静态吃内存最少(静态生成的方式是直接从硬盘中读取,可以比较节约服务器资源,也是目前进行SEO优化大多数站长比较喜欢的方式),也就是说如果在其他因素完全一致的情况下,伪静态会占用更多内存。

伪静态原理:

脚本程序通过服务器CPU运算,读取数据库,将动态页面临时存储在RAM内存中,同时通过URL重写方式映射一个静态页面的地址,传送至浏览器。

2:程序运行及访问量

实际上访客的每一次访问都会激发一次这样的过程,当有较多访客的时候,数据库就要多次读取,数据库读取、动态页面、URL重写,这个三个过程中都需要使用到RAM内存。

(1)频繁读取数据库

如果访问一个网页,程序运行过程中造成数据库频繁读取,也会造成内存使用率偏高的情况,这种情况建议对数据库读取的代码进行优化,以减少读取频率。

这种情况比较容易产生的是DZ一类的论坛程序,网上有很多站长反应这个情况,某个站长采用了2核4G的虚拟主机,没有任何访问量的情况下按说正常运行没问题,但是一开站就满载死机,最后分析找到了原因,其实是因为开了DZ的某个插件,这个插件对数据库进行比较频繁的读取,关闭这个插件后网站可以正常运行了。

(2)程序运行

服务器脚本程序运行某些任务的时候也会有内存过高的情况,你可以将服务器脚本运行当做你电脑的某个软件运行,比如3D、制图软件肯定是要比只听个音乐所需要的内存少,虽然动态页面的程序在大多数站长看来只是网页格式,但是这种脚本程序也如同我们电脑上的软件一样 *** 作着服务器本身的运算、运行。

所以,建议在进行网站程序设计的时候建议能考虑到对服务器资源的使用,一个网页程序的功能越复杂也就意味着对服务器资源消耗越大。

比如在线制作类的网站,虽然 *** 作端口在浏览器,但是进行数据处理和数据临时保存的确是在服务器端,如果所需要处理的复杂且元素较多,那么肯定是会占用更大的内存资源的。

(3)网络访问及超大文件上传

通常在虚拟主机上都有一个IIS的数据,你可以理解为1个IIS就是打开一个网页的在线状态,每开一个IIS就会多一点内存的使用,当访问强度达到一定量的时候虚拟主机的内存就会比较紧张,特别对于动态页面、伪静态页面的影响更大。

比如:某个DZ系统在运行的时候,就有可能出现一个人打开10多个页面,在进行大上传的过程中很容易造成虚拟主机内存使用过高,所以对于这类程序一般都要设置文件上传限制,禁止一些超大的上传,以及一些站内多媒体文件的访问。

优化方案

1:设置页面缓存

可以通过设置页面缓存的方式让浏览器端访问一次网站后将一些通用文件进行缓存,降低多次读取访问对服务器形成的访问压力。

举例说明:Dz一类的程序是有页面缓存设置选项的,织梦cms后台也有关于缓存设置的性能选项(系统-性能选项-需缓存内容全局缓存时间),可以 通过后台进行优化配置;另外一些国内的免费CDN服务也有提供缓存机制,通过CDN方式本身也相当于设置了网页缓存机制,通过CDN也能降低虚拟主机本身的运行压力。

2:内存优化

可以通过优化配置网站的一些文件来实现网站对虚拟主机内存使用情况的优化。

举例说明:Dz类的程序后台有提供内存优化的文件说明,具体可以按照后台的说明进行 *** 作。

3:服务器优化

原理与页面缓存有点类似,主要可以通过禁用页面刷新功能等来降低页面多次加载造成的内存占用过多,一般来说有些服务器是有设置了虚拟主机页面刷新的机制,只要过快刷新页面就会出现阻挡页面,但是有些CMS的后台也有这样的防护机制可以设置。

举例说明:Dz类程序后台的服务器优化配置里有相应的配置,可以参考下图

总结

目前所有关于虚拟主机内存占用过高的原因就是这些,需要指出的是如果使用伪静态或者动态页面遇到网页端的DDOS攻击也会出现内存使用过高的情况,所以具体问题具体分析,原理已告知,对于程序方面的具体优化至少有个概念了。同时考虑到大多数站长对于网站程序本身没有什么优化能力,建议在挑选CMS的时候选择能生成静态页面的这一类程序,这类程序对于内存的需求相对较低,也更利于SEO。

参考资料:

虚拟主机内存高什么原因

以上就是关于频繁查询数据库,怎么保证整个系统的性能全部的内容,包括:频繁查询数据库,怎么保证整个系统的性能、频繁查询mysql数据库导致崩溃、MySQL数据库中一个表A, 频繁的进行插入更新 *** 作, 我想知道对A进行查询读取是否会受到影响等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10145876.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存