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


猜你喜欢
- IF函数IF(expression ,expr_true, expr_false);MySQL的IF()函数,接受三个表达式,如果第一个表达
- 如何使用Office Chart 9.0 制作图表?代码如下:chart90.asp<HTML><HEAD><
- <?php/* Function Written by Nelson Neoh @3/2004. For th
- 大家好,今天给大家带来一篇如何优化time.After函数。最近我在做调度中心2.0的重构。本次重构使用的GO语言开发。在项目中,基本都离不
- 判断python中的一个字符串是否为空,可以使用如下方法1、使用字符串长度判断len(s) ==0 则字符串为空#!/user/local/
- python数组和矩阵先创建一个一维数组直接定义一个数组:a = [1,2,3,4,5]b = ['a','c
- composer是PHP中非常优秀的一个包管理工具,可以帮助我们来管理项目所需要依赖的所有包以及插件,也可以用来从packagist中创建一
- 引言在经历过一些尝试之后,觉得在当下的项目中运用链路压测的能力,不等着其他人了。链路这个词其实不如路径通俗易懂,跟产品沟通这个比较有效率。具
- 前言vue是现在很火的一个前端MVVM框架,它以数据驱动和组件化的思想构建,与angular和react并称前端三大框架。相比angular
- 一、Beautiful Soup库简介BeautifulSoup4 是一个 HTML/XML 的解析器,主要的功能是解析和提取 HTML/X
- 一般来说,我们为了得到更完整的结果,我们需要从两个或更多的表中获取结果,我一般都是用select xxx,xxx from 表1,表2 wh
- 1、引言小 * 丝:鱼哥,你说咱们发快递时填写的地址信息,到后台怎么能看清楚写的对不对呢?小鱼:这种事情还要问? 你没在电商行业混过??小 * 丝:
- 当我们写用例断言时,往往一个断言结果是不够的,所以需要加入多重断言,而多重断言,当断言中间出现断言结果False时,会中断后续的断言执行,会
- 缩略图在很多时候我们都需要将图片按照同比例缩小有利于存储 但是一张张手动去改的话太麻烦了 今天我们就用python实现一个简单的将一个文件夹
- MySQL 创建数据库和创建数据表MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。在这之前,需要先安装好
- 一、为什么要搭建爬虫代理池在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时
- PHP asXML()函数实例格式化 XML(版本 1.0)中的 SimpleXML 对象的数据:<?php $note=<&l
- 一、Can't connect to MySQL server on 'localhost'(10061
- ----------记录一下这两天做的一个小demo功能是要实现一个从前端传给后端一张图片,在后端完成目标检测后,传给前端,前端接收后并展示
- 就像标题呈现的一样,SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入、更新或删除操作。最典型