• MySQL:你做过哪些MySQL的优化?


    SQL和索引优化

    一般是开启慢查询日志,设置合理的慢查询时间,在做业务的时候就会记录慢查询SQL,再根据explain来分析慢SQL的执行计划,再设计优化措施,比如,添加索引等。

    应用上的优化

    连接池

    连接数据库:若短时间内有大量客户端连接进来,可以引入数据库连接池,省去大量三次握手,密码校验等操作。

    详情:
    应用上一般访问数据库,都是先和MySQL Server创建连接,然后发送SQL语句,Server处理完成后,再把结果通过网络返回给应用,然后关闭和MySQL Server的连接,因此短时间大量的数据库访问,消耗的TCP三次握手和四次挥手所花费的时间就很大了,稍微大一点的项目,我们都会在应用访问数据库的那一层上,添加连接池模块,相当于应用和MySQL Server事先创建一组连接,当应用需要请求MySQL Server时,不需要再进行TCP连接和释放连接了,一般连接池都会维护以下资源:
    1、连接池里面保持固定数量的活跃TCP连接,供应用使用。
    2、如果应用瞬间访问MySQL的量比较大,那么连接池会实时创建更多的连接给应用使用。
    3、当连接池里面的TCP连接一段时间内没有被用到,连接池会释放多余的连接资源,保留它设置的最
    大空闲连接量就可以了。
    连接池可以自己实现,也可以用第三方写好的库。

    增加cache缓存层

    引入缓存:存储热点数据,频繁访问的话,数据库也会顶不住,可以引入redis存储热点数据,当有客户端请求进来service后端时,之前是去数据库直接查询,现在可以先去redis缓存查询,如果没有想要的数据,在访问MySQL,并把读取的数据缓存在redis上。
    但如果涉及到缓存,又会被问道缓存数据一致性问题,缓存穿透,缓存雪崩,redis的其他功能等问题。。。

    MySQL server的优化

    各种参数的配置,关闭自适应哈希索引,InnoDB_log_buffer、InnoDB_buffer_pool_size的配置等。

    MySQL查询优化

    MySQL的查询缓存是把select查询语句上一次的查询结果记录下来放在缓存当中,下一次再查询相同内容的时候,直接从缓存中取出来就可以了,不用再进行一遍真正的SQL查询。但是当两个select查询中间出现insert,update,delete语句的时候,查询缓存就会被清空。查询缓存适用更新不频繁的表,因为当表更新频繁的话,查询缓存也总是被清空,过多的查询缓存的数据添加和删除,就会影响MySQL的执行效率,还不如每次都从磁盘上查来得快(缓存指的就是一块内存,内存I/O比磁盘I/O快很多)。
    可以在MySQL上通过以下命令,来查看查询缓存的设置:

    在这里插入图片描述
    通过show status命令,可以查看MySQL查询缓存的使用状况,如下:

    在这里插入图片描述

    可以通过set命令设置上面的缓存参数开启MySQL查询缓存功能,也可以找到MySQL的配置文件(windows是my.ini,linux是my.cnf),修改query_cache_type参数为1就可以了,然后重启MySQL
    Server就可以使用了,如下:

    在这里插入图片描述

    修改完成,重启MySQL Server,查询缓存生效。

    索引和数据缓存

    主要指的就是innodb_buffer_pool_size配置项,从名字上就能看到,该配置项是针对InnoDB存储引擎起作用的,这个参数定义了InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。
    innodb_buffer_pool_size是同时为数据块和索引块做缓存,这个值设得越高,访问表中数据需要的磁
    盘 I/O 就越少。

    innodb_buffer_pool_size=512M

    MySQL线程缓存

    主要指配置文件中thread_cache_size配置项。给大家讲过MySQL Server网络模块采用经典的I/O复用+线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的,所以线程池就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(MySQL会根据连接量,自动加大线程池的数量)。

    thread_cache_size=10

    配置完thread_cache_size,重启MySQL Server服务生效。

    并发连接数量和超时时间

    MySQL Server作为一个服务器,可以设置客户端的最大连接量和连接超时时间,如果数据库连接统计数量比较大,这两个参数的值需要设置大一些。

    在这里插入图片描述

    在配置文件(my.cnf或my.ini)最下面,添加配置:max_connections=2000,然后重启MySQL
    Server,设置生效。

    在这里插入图片描述

    MySQL Server对于超时未通信的连接,进行主动关闭操作。设置超时时间,超过设置时间没有请求就主动断开,单位是秒,在配置文件中添加配置:wait_timeout = 600。

    图示

    在这里插入图片描述

  • 相关阅读:
    数学建模理论与实践国防科大版
    Java线程同步:synchronized、Lock锁
    人脸检测和人体检测4:C++实现人脸检测和人体检测(含源码,可实时检测)
    【调度算法】NSGA III
    老师设计的库CRC计算
    操作系统(一):什么是操作系统
    LRU自定义最近最少使用-java实现
    超纯水制备
    ShellExecute的用法
    从飞天到倚天 阿里云底层自研技术大爆发
  • 原文地址:https://blog.csdn.net/m0_56257585/article/details/126240831