mysql调优的几种方式小结

作者:_不吃猫的鱼_ 时间:2024-01-25 22:24:41 

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(索引)

来源:https://blog.csdn.net/m0_52191385/article/details/128242561

标签:mysql,调优
0
投稿

猜你喜欢

  • 详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

    2022-05-22 08:39:32
  • golang一些常用的静态检查工具详解

    2024-04-25 13:16:17
  • Pytest之测试命名规则的使用

    2022-09-23 00:51:49
  • Python编程之gui程序实现简单文件浏览器代码

    2021-08-20 11:09:36
  • python实现opencv+scoket网络实时图传

    2023-07-03 16:09:17
  • selenium+python截图不成功的解决方法

    2021-06-02 23:25:06
  • 网马解密大讲堂——网马解密初级篇

    2009-09-16 14:45:00
  • XSL简明教程

    2013-08-08 00:19:06
  • 用asp实现的获取文件夹中文件的个数的代码

    2011-03-08 11:02:00
  • golang switch语句的灵活写法介绍

    2024-04-23 09:39:49
  • Bootstrap Table快速完美搭建后台管理系统

    2024-05-09 09:48:16
  • Mysql启动的方式(四种)

    2024-01-28 02:38:53
  • python两种获取剪贴板内容的方法

    2021-03-05 11:18:56
  • Pytorch中的Tensorboard与Transforms搭配使用

    2023-07-09 08:27:05
  • Python爬虫信息输入及页面的切换方法

    2023-08-02 17:33:33
  • Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法

    2023-06-15 21:26:42
  • Python2.x中文乱码问题解决方法

    2023-09-20 14:35:35
  • 破解加密的网页代码方法

    2010-03-16 12:35:00
  • anaconda python3.8安装后降级

    2021-09-12 05:28:51
  • 深入理解TCP协议与UDP协议的原理及区别

    2022-11-06 21:30:31
  • asp之家 网络编程 m.aspxhome.com