浅谈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性能优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ubuntu18.04安装mysql5.7.23的教程

    Ubuntu18.04安装mysql5.7.23的教程

    这篇文章主要为大家详细介绍了Ubuntu18.04安装mysql5.7.23的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 关于MySQL死锁问题的深入分析

    关于MySQL死锁问题的深入分析

    这篇文章主要给大家介绍了关于MySQL死锁问题的深入分析,文中通过示例代码介绍的非常详细,对大家的学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 与MSSQL对比学习MYSQL的心得(三)--查看字段的长度

    与MSSQL对比学习MYSQL的心得(三)--查看字段的长度

    今天我们来对比下MYSQL和MSSQL关于查看字段长度之间的区别
    2014-06-06
  • SQL优化老出错,那是你没弄明白MySQL解释计划用法

    SQL优化老出错,那是你没弄明白MySQL解释计划用法

    本篇文章讲的是SQL优化老出错,那是你没弄明白MySQL解释计划用法,有兴趣的小伙伴速度来看看吧,希望本篇文章能够帮助到你
    2021-11-11
  • IDEA配置连接MYSQL数据库遇到Failed这个问题解决

    IDEA配置连接MYSQL数据库遇到Failed这个问题解决

    这篇文章主要介绍了IDEA配置连接MYSQL数据库遇到Failed这个问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 删除MySQL数据库的简单教程

    删除MySQL数据库的简单教程

    这篇文章主要介绍了删除MySQL数据库的简单教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • MySQL数据时区问题以及datetime和timestamp类型存储的差异

    MySQL数据时区问题以及datetime和timestamp类型存储的差异

    这篇文章主要介绍了MySQL数据时区问题以及datetime和timestamp类型存储的差异,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MySQL系列之三 基础篇

    MySQL系列之三 基础篇

    本文主要介绍了MySQL基础使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • mysql order by 排序原理解析

    mysql order by 排序原理解析

    当涉及到大量数据时,对于 ORDER BY 操作,可以考虑为相应的列添加索引,如果不使用索引,mysql会使用filesort来进行排序,这篇文章主要介绍了mysql order by 排序原理,需要的朋友可以参考下
    2024-02-02
  • MySQL性能瓶颈排查定位实例详解

    MySQL性能瓶颈排查定位实例详解

    这篇文章主要介绍了MySQL性能瓶颈排查定位的方法,结合实例形式详细分析了MySQL排查性能瓶颈问题的步骤与相关技巧,需要的朋友可以参考下
    2016-04-04

最新评论