MYSQL优化的方案:
1.避免使用select *查询全部信息,select语句指明需要的字段。
2.用union all 代替union
union:对两个结果集进行并集操作, 不包括重复行,相当于distinct,会对获取的结果进行排序操作。
union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复,不会对获取的结果进行排序操作
union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高
3.小表驱动大表
in 的话里面驱动外面,适合里面是小表
exist 的话外面驱动里面,适合外面是小表
4.批量插入
mybatis plus 的insertBatch 当然一次插入量也不能太大,可以分批插入。
5.多用limit限制查询返回记录数
6.用连接查询代替子查询
MySQL如果需要在两张以上表中查询数据的话,一般有两种实现方式:子查询、连接查询
子查询可以通过in实现,
select * from order where user_id in (select id from user where name=‘zhang’);
优点:这样简单,缺点是,MySQL执行子查询时,需要创建临时表,查询完成后再删除临时表,有一些额外开销。
连接查询:
select * from order as o inner join user u on o.user_id = u.id where u.name='zhang';
7.控制索引数量
索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
8.选择合理的字段类型
尽可能的使用 varchar 代替 char ,因为变长字符串类型存储空间小,可以节省存储空间,查询效率提高。
char:固定字符串类型,该类型在的字段在存储空间上是固定的,固定长度的可以用。
长度固定字符串用char,不固定用varchar。
能用数字类型就不用字符串,字符串处理速度比数字类型慢
尽量用小类型,比如:用bit存布尔值,用tinyint存枚举值等。
9.提升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;
10.索引优化
强制走哪个索引 force index
select * from user
force index(索引)
11.sql语句中IN包含的值不应过多
MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了.
12.当只需要一条数据的时候,使用limit 1
13.join表不宜超过3个
join用的最多的时left join 和 inner join
left join:两个表的交集和左表的剩余数据
inner join:两个表的交集
inner join mysql会自动选择小表驱动,
left join 左边的表驱动右边的表