当前位置:网站首页>数据库优化
数据库优化
2022-06-27 18:05:00 【无敌的神龙战士】
1、SQL和索引的优化
(数据量比较大,执行SQL效率低,要优化)
开启慢查询日志-》设置相应的项目表数据量的合理的慢查询时间–》找到记录慢查询SQL–》用explain分析SQL的执行计划–》给出相应的优化措施–》如果数据量太大的话,用分页。没有用索引。用多列索引没没有用到第一列。联合查询的大小表设置。多表查询不用in,用外连接替代带in子查询的过程,合理使用索引,不会产生中间表。
2、应用优化
- 1、连接数据库上,可以引入连接池(中间件)
- 2、引入缓存(存储热点数据,redis,如果客户端的请求来了,先在redis上查一下,如果redis上直接查到就不经过数据库,如果没有查到就去访问MySQL数据库,访问回来,先把访问的数据往redis上缓存一下,再把结果返回给用户。redis是基于内存的数据库)
业务上增加redis、memcache,一般用缓存把经常访问的数据缓存起来。
引入redis缓存的话,就要防止这些问题 :缓存数据一致性问题。缓存穿透和缓存雪崩的问题。
除了优化SQL和索引,很多时候,在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对上层的应用来进行一些优化,使得上层应用访问数据库的压力能够减到最小。
连接池
应用上一般访问数据库,都是先和MySQL Server创建连接,然后发送SQL语句,Server处理完成后,再把结果通过网络返回给应用,然后关闭和MySQL Server的连接,因此短时间大量的数据库访问,消耗的TCP三次握手和四次挥手所花费的时间就很大了,稍微大一点的项目,我们都会在应用访问数据库的那一层上,添加连接池模块,相当于应用和MySQL Server事先创建一组连接,当应用需要请求MySQL Server时,不需要再进行TCP连接和释放连接了,一般连接池都会维护以下资源:
1、连接池里面保持固定数量的活跃TCP连接,供应用使用。
2、如果应用瞬间访问MySQL的量比较大,那么连接池会实时创建更多的连接给应用使用。
3、当连接池里面的TCP连接一段时间内没有被用到,连接池会释放多余的连接资源,保留它设置的最大空闲连接量就可以了。
连接池可以自己实现,也可以用第三方写好的库。
MySQL查询缓存
MySQL的查询缓存是把select查询语句上一次的查询结果记录下来放在缓存当中,下一次再查询相同内容的时候,直接从缓存中取出来就可以了,不用再进行一遍真正的SQL查询。 (在内存中划分一块空间用做缓存的地方)
但是当两个select查询中间出现insert,update,delete语句的时候,查询缓存就会被清空。查询缓存适用于更新不频繁的表,查询频繁的表,因为当表更新频繁的话,查询缓存也总是被清空,过多的查询缓存的数据添加和删除,就会影响MySQL的执行效率,还不如每次都从磁盘上查来得快(缓存指的就是一块内存,内存I/O比磁盘I/O快很多)。
索引和数据缓存
主要指的就是innodb_buffer_pool_size配置项,从名字上就能看到,该配置项是针对InnoDB存储引擎起作用的,这个参数定义了InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。
innodb_buffer_pool_size是同时为数据块和索引块做缓存,这个值设得越高,访问表中数据需要的磁盘 I/O 就越少。
MySQL线程缓存
主要指配置文件中thread_cache_size配置项。给大家讲过MySQL Server网络模块采用经典的I/O复用+线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的,所以线程池就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(MySQL会根据连接量,自动加大线程池的数量)。(线程池的线程数量随着请求越来越多,是可以动态增加的)
可伸缩的线程池(初始化是1个线程,处理所有业务,如果业务请求处理不来,向线程池请求线程总失败,此时线程池会创建更多的线程来处理更多的请求,处理完之后一段时间,可能请求没有那么多了,空闲的线程会回到线程池,线程池还会根据相应的配置减少线程池里的线程,把资源归还给系统)
3、MySQL Server优化
各种参数的配置
关闭自适应哈希索引, 维护自适应哈希索引要花费很多性能,如果很少用到,通过参数配置关掉它。
提高redo log性能,可以重置InnoDB log buffer大小(redo log缓存的大小),Innodb_buffer_pool_size(缓存的大小),来减少磁盘I/O次数,因为缓存区大了,在缓冲区工作的时间就长了,效率就高了。
对于MySQL Server端的优化,主要指的就是MySQL Server启动时加载的配置文件的配置项内容的优化
边栏推荐
- SQL Server - Window Function - 解决连续N条记录过滤问题
- Crontab's learning essays
- Leetcode 989. 数组形式的整数加法(简单)
- Making single test so simple -- initial experience of Spock framework
- 带你认识图数据库性能和场景测试利器LDBC SNB
- On thread safety
- 这个是和数据采集一样,可以定义一个参数为上个月或者前一天,然后在sql中使用这个参数吗?
- NVIDIA Clara-AGX-Developer-Kit installation
- 实战回忆录:从Webshell开始突破边界
- Redis持久化
猜你喜欢

带你认识图数据库性能和场景测试利器LDBC SNB
![[login interface]](/img/72/d527a5de23aa9da108e405eb6bb39c.png)
[login interface]

crontab的学习随笔

Data intelligence enters the "deep water area", and data governance is the key

数智化进入“深水区”,数据治理是关键

键入网址到网页显示,期间发生了什么?

连接集成开发专题月 | 企业主数据治理的驱动因素

UE4:Build Configuration和Config的解释

Observable, reliable: the first shot of cloudops series Salon of cloud automation operation and maintenance

Mathematical derivation from perceptron to feedforward neural network
随机推荐
【登录界面】
UE4-Actor基础知识
1023 Have Fun with Numbers
UE4实现长按功能
Bit.Store:熊市漫漫,稳定Staking产品或成主旋律
MySQL表的增删改查(基础)
shell脚本常用命令(三)
Character interception triplets of data warehouse: substrb, substr, substring
Array exercises follow up
一对一关系
Redis持久化
ABAP-SM30删除前检查
运算符的基础知识
Embracing cloud Nativity: Practice of Jiangsu Mobile order center
实战回忆录:从Webshell开始突破边界
过关斩将,擒“指针”(下)
Memoirs of actual combat: breaking the border from webshell
Accumulating power in the middle stage, UFIDA IUAP builds a new base for digital intelligence of social enterprises
MySQL初学者福利
Is it safe to buy stocks online and open an account?