浅谈MySQL的性能优化

 更新时间:2023年08月25日 09:40:49   作者:抠脚的大灰狼  
这篇文章主要介绍了浅谈MySQL的性能优化,MySQL性能优化是通过对数据库的配置、查询优化以及索引优化等手段提高数据库的响应速度和处理能力,本文从多个层面对mysql性能优化进行了小结,需要的朋友可以参考下

服务器层面

  • innodb_buffer_pool_size

将缓冲池的大小设置的尽可能大,比如设为总内存的3/4。这样可以减少mysql的磁盘IO次数,使得尽可能地从缓冲池里读数据

  • innodb_log_file_size

在生产环境下,可以尽可能地把一些日志开关给关掉。比如通用查询日志,慢查询日志,错误日志。并且,将redo log的大小设置的足够大,避免由于redo log过小,导致频繁的脏页刷磁盘

  • innodb_flush_log_at_trx_commit

当对数据的安全性要求不是那么高的时候,可以考虑将此参数设为0或者2,减少刷磁盘频率

表设计层面

  • 对于统计和分析类等对实时性要求不高的需求(OLAP),设计中间表,避免直接查大量的raw data
  • 创建合理的冗余字段,以减少连表查询
  • 表中不经常使用的字段,或者存储了过多字段,考虑拆表
  • 每张表都要有个主键,且主键最好是自增的int类型

SQL语句层面

索引优化

  1. 为经常出现在where条件中的字段,需要排序的字段创建合适的索引(当读多写少时,可以考虑创建索引)
  2. 当需要对多个列建索引时,优先考虑组合索引,而不是多个单列索引,并且合理的组织组合索引的顺序,将筛选粒度大的列,放到组合索引的最左
  3. 尽量使用覆盖索引,而不要使用SELECT * ,可避免回表查询

LIMIT优化

  1. 若预计查询结果只有1条,使用LIMIT 1可以提前终止全表扫描
  2. 子查询优化

当使用LIMIT进行分页时,页码过大时,LIMIT的偏移量会很大,此时会导致MySQL扫描大量不需要的行,然后再丢弃,性能很差。

比如 LIMIT 10000,20 ,会先扫描前10000行,然后丢弃,最后取10000后的20行。

此时可以使用子查询来做优化

-- 原SQL
select * from product limit 10000,20;
-- 优化后的SQL
select * from product where id >(select id from product order by id limit 10000,1) limit 20;
-- 由于子查询使用了id主键索引,且查询是覆盖索引,可以很快的定位到10000的位置
-- 当单表查询,且主键已经是排序好的,可以直接简写如下
select * from product where id > 10000 limit 20;

其他优化

  1. 统计数量时,尽量用count(1),或count(列),而不要用count(*)
  2. 两张表进行关联时,关联字段最好都建立索引,且最好字段类型一致
  3. where 条件中不使用not in (可使用not exists)
  4. 合理使用慢查询日志,explain查看执行计划,show profile 查看SQL执行时的资源使用情况

到此这篇关于浅谈MySQL的性能优化的文章就介绍到这了,更多相关MySQL性能优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql中如何查询多个表中的数据量

    mysql中如何查询多个表中的数据量

    这篇文章主要介绍了mysql中如何查询多个表中的数据量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL中优化CPU使用的详细指南

    MySQL中优化CPU使用的详细指南

    优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择
    2025-08-08
  • MySQL查询优化与事务实战教程

    MySQL查询优化与事务实战教程

    文章介绍了MySQL查询语法与事务管理,涵盖InnoDB/MyISAM区别、多表连接、分组统计、子查询、分页技术,及事务四大特性和隔离级别(读未提交、读已提交、可重复读、可串行化),并强调了参数化查询的重要性以防范SQL注入,感兴趣的朋友一起看看吧
    2025-07-07
  • mysql容器之间的replication配置实例详解

    mysql容器之间的replication配置实例详解

    这篇文章主要给大家介绍了关于mysql容器之间replication配置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • mysql8.0.19忘记密码处理方法详解

    mysql8.0.19忘记密码处理方法详解

    这篇文章主要介绍了mysql8.0.19忘记密码处理方法详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • MySQL实现去重的几种方法小结

    MySQL实现去重的几种方法小结

    在MySQL中,SELECT DISTINCT 和 GROUP BY 可以用来去除重复记录,二者有相似的功能,但在某些情况下有所不同,本文将通过代码示例给大家详细介绍这几种方法,感兴趣的小伙伴跟着小编一起来看看吧
    2024-07-07
  • 免安转MySQL服务的启动与停止方法

    免安转MySQL服务的启动与停止方法

    免安转MySQL服务的启动与停止方法,可以不用安装解压以后即可执行,对于老手推荐,新手建议用安装版本。
    2011-03-03
  • MySQL如何查询客户端连接情况

    MySQL如何查询客户端连接情况

    这篇文章主要介绍了MySQL如何查询客户端连接情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 详解MySQL如何交换两列值数据

    详解MySQL如何交换两列值数据

    最近遇到了需要将表里的两列值进行互换,原因是存库时值存放反了,在编码语言中,我们一般可以通过定义一个临时变量c,将b赋值给c,a赋值给b,c赋值给a就能实现a和b的值互换,那么,在mysql中,非储存过程的sql语句,没有定义变量的过程,如何实现呢,接下来由小编给大家介绍一下
    2024-01-01
  • MySQL8.0数据库开窗函数图文详解

    MySQL8.0数据库开窗函数图文详解

    开窗函数为将要被操作的行的集合定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列,这篇文章主要给大家介绍了关于MySQL8.0数据库开窗函数的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论