【mysql学习笔记25】sql语句优化

insert优化

1.多条单个insert语句可以合并成一条批量插入insert语句。一次插入肯定比多次插入效果好,因为每次插入都需要建立连接。
2.手动控制事务。因为mysql的事务默认是自动的,每执行一条sql语句都会开启一个事务。
3.主键顺序插入。这和mysql底层有关。
4.大批量数据导入不建议使用insert,而是load指令。
在这里插入图片描述
#客户端连接服务端时,加上参数–local-infile
mysql --local-infile -u root -p
#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
#执行load指令将准备好的数据,加载到表结构中
load data local infile ‘/root/sql1.log’ into table ‘tb_user’ fields terminated by ‘,’ lines terminated by ‘\n’;

主键优化

1.在innodb引擎中,表数据是根据主键组织存放的,这种存储方式称为索引组织表(index organized table IOT)
主键乱序插入时容易发生页分裂,因此应避免乱序插入,或者直接使用自增主键,一劳永逸
拓展:页合并,当一页中的数据量低于50%时,mysql会尝试合并相邻页,称为页合并
2.在开发中应该尽量降低主键长度,因为二级索引存的都是主键,逐渐越长占空间越大

order by优化

using filesort:把数据放入缓存区,进行排序。
using index:直接利用索引返回排序结果。
mysql由于使用了B+Tree索引,容易按顺序遍历数据,索引当order by后面跟的字段有索引时,就不需要额外的排序,使得order by效率提高。
如果没有使用覆盖索引,那么使用索引排序是不现实的,因为缺少字段,所以需要进行filesort。
filesort的缓冲是是有大小限制的,如果数据超出了缓冲区就会在磁盘上排序,大大影响性能。
缓冲区大小是可以调整的。
在这里插入图片描述

group by优化

using temporary:使用临时表分组,效率低
using index:使用索引分组,效率高

设表user有(profession,age,status)联合索引
select profession from user group by profession;#using index
select age,count(age) from user group by age;#using index;using temporary
注:前面有一个using index是因为覆盖索引
select profession , age, count() from tb_user group by profession,age;#using index
select age, count(
) from tb_user where profession = ‘软件工程’ group by age;#using index

limit优化

select * from tb_sku limit 2000000,10;
替换为
select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = a.id;

count优化

myisam引擎使用单独变量记录了表的记录总数,所以count效率很高,前提是没有where
innodb引擎则需要全表扫描,才能统计数量
优化思路:自己额外开辟一个地方存储总数量
count(字段)<count(主键)<count(1)≈count(*)

update优化

更新时尽量根据有索引的字段更新,这样子是行锁,否则会变成表锁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值