SQL优化

插入数据

批量插入

insert into tb values(x,x),(x,x),(x,x)

手动提交事务

start transaction;

insert into tb values(x,x),(x,x),(x,x);

insert into tb values(x,x),(x,x),(x,x);

commit;

主键顺序插入

大批量插入数据

insert语句插入性能较低,可使用MYSQL数据库提供的load指令进行插入

客服端连接服务器时加上参数--local-infile

mysql --local-infile -u root -p

设置全局参数local-infile=1,开启从本地加载文件导入数据开关

set globel local_infile=1;

执行load指令将准备好的数据,加载到表结构中。

load data local infile '/root/sql1.log' into table 'tb' fields terminated by ',' lines terminated by '\n';

select @@local_infile;

主键优化

数据组织方式

在InnoDB中存储引擎中,表数据根据主键顺序组织存放的,这种存储方式的表为索引组织表。

页分裂

当插入一行记录,每页包含2——N数据,根据主键排序

页合并

当页中删除记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始找最近的页(前后)是否可以合并以优化空间。

主键设计原则

尽量降低主键长度

尽量选择顺序插入数据,使用AUTO_INCREMENT自增主键

尽量不要使用UUID做主键或其它自然主键。

业务操作时,避免对主键的修改。

order by优化

1) Using filesort :通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,不是通过索引直接返回排序结果的排序都叫FileSort排序。

2) Using index:有序索引顺序扫描直接返回有序数据,不需要额外排序,操作效率高。

1)根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则

2)尽量使用覆盖索引

3)多字段排序,一个升一个降,注意联合索引创建规则

4)不可避免出现filesort,大数量排序,可适当增大排序缓冲区大小sort_buffer_size(默认256K)

group by优化

在分组操作时,可以通过索引来提高效率

分组操作时,索引的使用也是满足最左前缀法则

limit优化

limit 2000000,10,此时MYSQL排序前2000010记录,仅返回2000000~1000010记录,其它记录丢弃,查询代价太大。

一般分页查询,通过创建覆盖索引能够较好提高性能,可以提高覆盖所有加子查询形式进行优化。

explain select * from tb , (select id from tb order by id limit 2000000,10) a where t.id=a.id;

count优化

MYISAM引擎吧一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;

InnoDB引擎执行count(*)的时候,需要吧数据一行一行地从引擎里面读出来,然后累积计数。

效率:count(字段)<count(主键id)<count(1)≈count(*),尽量使用count(*)

update优化

InnoDB的行锁是针对索引的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。

尽量根据主键/索引字段进行数据更新。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值