mysql调优的几种方式小结

 更新时间:2023年05月25日 10:59:47   作者:_不吃猫的鱼_  
本文主要介绍了mysql调优的几种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

sql调优的几种方式:避免使用select *、用union all 代替union、小表驱动大表、批量操作、多用limit、in中值太多、增量查询、高效的分页、用链接查询代替子查询、join数量不宜过多、join时需要注意、控制索引的数量、选择合理的字段类型、提升group by的效率、索引优化。

1、避免使用select *

select *会查询所以字段,实际业务场景中不需要所有的字段,可以不进行查询。

2、用union all 代替union

union会排重,排重过程需要遍历,排序,比较,更消耗cpu资源。在确定唯一,没有重复数据的情况下,尽量用用union all。

3、小表驱动大表

in 的话里面驱动外面,in适合里子查询是小表
exist 的话外面驱动里面,适合外面是小表

4、批量插入

当然一次插入量也不能太大,可以分批插入。

5、使用limit

在不需要获取全部记录的情况下,使用limit获取指定数量。

6、in中值太多

查询出来数量太大,限制一次最大查询条数

还可以,多线程查询,最后把查询出来的数据汇总。

7、增量查询

select name,age from user where id>#{lastId} limit 100;

查询比上次id 大的100条

8、高效的分页

select id,name,age from user limit 10000, 20;

mysql会查询10020条,然后丢弃前面10000条,这个比较浪费资源

可以优化:

select id,name,age from user id>10000 limit 20;

找到上次分页最大id
假如id是连续的,并且有序,可以用between
注意: between要在唯一索引上分页,不然会出现每页大小不一致问题。

9、用连接查询代替子查询

MySQL如果需要在两张以上表中查询数据的话,一般有两种实现方式
子查询
连接查询

select * from order where user_id in (select id from user where name='vie'); 

子查询可以通过in实现,优点:这样简单,
但缺点是,MySQL执行子查询时,需要创建临时表,查询完成后再删除临时表,有一些额外开销。
可以改成连接查询:

select o.* from order o inner join user u on o.user_id = u.id where u.name='vie'; 

10、join表不宜过多

join表不宜超过3个,如果join太多,MySQL在选择索引时会非常复杂,很容易选错索引。
并且没有命中,nested loop join 就会分别从两个表读一行数据进行对比,时间复杂度n^2。

11、join时需要注意

join用的最多的时left join 和 inner join
left join:两个表的交集和左表的剩余数据
inner join:两个表的交集

inner join mysql会自动选择小表驱动,
left join 左边的表驱动右边的表

12、控制索引数量

索引不是越多越好,索引需要额外的存储空间,B+树保存索引,额外的性能消耗。
单表索引数量尽量控制在5个以内,且单个索引字段数量控制在5个以内。

13、选择合理的字段类型

能用数字类型就不用字符串,字符串处理速度比数字类型慢

14、提升group by效率

主要功能去重,分组
先过滤数据,减少数据,再分组

select id, name ,age from user
group by id
having id <50; 

这种写法就不好,建议以下写法:

select id, name ,age from user
where id <50
group by id; 

15、索引优化

强制走哪个索引

select * from user 
force index(索引)

到此这篇关于mysql调优的几种方式小结的文章就介绍到这了,更多相关mysql调优内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql中profile的使用方法教程

    mysql中profile的使用方法教程

    这篇文章主要给大家介绍了关于mysql中profile的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • MySQL 角色(role)功能介绍

    MySQL 角色(role)功能介绍

    这篇文章主要介绍了MySQL 角色(role)功能的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-04-04
  • centos7环境下二进制安装包安装 mysql5.6的方法详解

    centos7环境下二进制安装包安装 mysql5.6的方法详解

    这篇文章主要介绍了centos7环境下二进制安装包安装 mysql5.6的方法,详细分析了centos7环境下使用二进制安装包安装 mysql5.6的具体步骤、相关命令、配置方法及操作注意事项,需要的朋友可以参考下
    2020-02-02
  • 手把手教你使用Navicat生成MySQL测试数据

    手把手教你使用Navicat生成MySQL测试数据

    Navicat是一套快速、可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设,下面这篇文章主要给大家介绍了关于使用Navicat生成MySQL测试数据的相关资料,需要的朋友可以参考下
    2023-05-05
  • MySQL 覆盖索引实战案例详解

    MySQL 覆盖索引实战案例详解

    本文通过实战案例揭示覆盖索引对MySQL性能优化的核心价值,解决因回表导致的55秒慢查询问题,优化后执行时间降至2秒,设计需兼顾字段完整性、顺序合理性及读写平衡,是提升查询效率的关键策略,感兴趣的朋友跟随小编一起看看吧
    2025-07-07
  • MySQL常用SQL语句总结包含复杂SQL查询

    MySQL常用SQL语句总结包含复杂SQL查询

    今天小编就为大家分享一篇关于MySQL常用SQL语句总结包含复杂SQL查询,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 关于Mysql查询带单引号及插入带单引号字符串问题

    关于Mysql查询带单引号及插入带单引号字符串问题

    本文主要介绍的是用mysql_real_escape_string对用户提交的表单数据进行转义处理和通过addslashes以及mysql_escape_string这3个类似功能的函数用法区别
    2013-04-04
  • 详解MySQL自增主键的实现

    详解MySQL自增主键的实现

    现在大部分的软件开发都离不开数据库。而mysql也是经常会用到的一个数据库。mysql数据库中有一个主键生成规则,就是自增。也是我们经常会用到的。本文就来介绍一下
    2021-09-09
  • MySQL PHP语法浅析

    MySQL PHP语法浅析

    在本篇文章里小编给大家分享了关于MySQL PHP语法的相关知识点,需要的朋友们学习参考下。
    2019-02-02
  • mysql 生成连续日期及变量赋值

    mysql 生成连续日期及变量赋值

    这篇文章主要介绍了mysql 生成连续日期及变量赋值的相关资料,分享内容及代码详细,具有一的参考价值,需要的小伙伴可以参考一下
    2022-03-03

最新评论