MySQL-SQL优化

insert优化(插入优化)

具体操作

1.批量插入

Insert  into  tb-test   values(1,'Tom'),(2,'Cat'),(3,'Jerry');

2.手动事务提交

start  transaction;

Insert  into  tb-test   values(1,'Tom'),(2,'Cat'),(3,'Jerry');

Insert  into  tb-test   values(4,'Tom'),(5,'Cat'),(6,'Jerry');

comment;

 主键顺序插入:

顺序插入性能高于乱序插入

 大批量数据插入:因为insert语句插入性能较低,我们需要使用MySQL提供的load指令进行插入。

使用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';

 主键优化

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

 页分裂:页可以为空,也可以一半,也可以全部,如果一行数据过大,会行溢出,根据主键排序。

 

页合并:

当删除一行记录是,实际上记录并没有被物理删除,只是记录被标记为删除并且它的空间变得允许被其他记录声明使用。

当页中删除的记录达到默认的一半,Innodb会开始寻找最靠近的页看看是否可以将两个页合并以优化空间使用。

 主键设计原则:

1.满足业务需求,尽量降低主键的长度

2.插入数据时,选择顺序插入,选使用自增主键

3.尽量不要使用UUID做主键或其他自然主键

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

order  by优化(排序优化)

设计原则:

1.尽量使用覆盖索引,避免使用*获得所有列

2.根据排序字段建立合数的索引,多字段排序时要遵循最左前缀原则

3.多字段排序时,要么同时升序或同时降序,如果要一升一降,要在创建联合索引时规定

4.如果无法避免filesort,可以适当增大排序缓存区大小

通过表的索引或者全表扫描,读取满足条件的数据行,然后在排序缓存区中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序

通过有序索引扫描直接返回有序数据,这种情况不需要额外排序,操作效率高

操作指令

#没有创建索引时,根据age,phone进行排序

explain  select  id,age,phone  from  tb_user  order  by  age,phone;

#创建索引

create  index  idx_user_age_phone_aa  on  tb_user(age,phone);

#创建索引后,根据age,phone进行升序排序

explain  select  id,age,phone  from  tb_user  order  by  age,phone;

#创建索引后,根据age,phone进行降序排序

explain  select  id,age,phone  from  tb_user  order  by  age desc,phone desc;

#根据age,phone进行降序一个升序,一个降序

explain  select  id,age,phone  from  tb_user  order  by  asc,phone asc;

#创建索引

create  index  idx_user_age_phone_ad  on  tb_user(age,phone);

#根据age,phone进行降序一个升序,一个降序

explain  select  id,age,phone  from  tb_user  order  by  age asc,phone desc;

 group  by优化(分组优化)

1.建立索引提高效率

2.索引的使用满足最左前缀原则

操作指令:

#删除掉目前的联合索引 idx_user_pro_age_sat

drop  index  idx_user_pro_age_sat  on  tb_user;

#执行分组操作,根据profession字段分组

explain  select  profession,count(*) from  tb_user  group  by  profession;

#创建索引

create  index  idx_user_pro_age_sta  on  tb_user(profession,age,status);

#执行分组操作,根据profession字段分组

explain  select  profession,count(*) from  tb_user  group  by  profession;

#执行分组操作,根据profession字段分组

explain select  profession,count(*)  from  tb_user  group  by  profession,age;

limit优化 (分页优化)

1.通过创建覆盖索引来提高性能

2.可以通过覆盖索引+子查询进行优化

count优化(计数优化)

count的几种用法:

1.count(主键):Innodb引擎会遍历整张表,把每行的主键id值取出,返回给服务层,服务层拿到主键后,直接按行进行累加(主键不能为null)

2.count(字段)

没有not null约束:Innodb引擎会遍历整张表,把每行的字段都取出来,返回给服务层,服务层判断是否为null,如果不为null,计数累加

有not  null约束:Innodb引擎会遍历整张表,把每行的字段都取出来,返回给服务层,直接按行进行累加

3.count(*)

Innodb引擎遍历整张表,但不取值,服务层对于返回的每行,放一个数字“1”进去,直接按行进行累加

4.count(1)

Innodb引擎并不会全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加

按照效率排序:count(字段)<count(主键id)<count(1)≈ count(*)

建议尽量使用count(*)

update优化(避免出现表锁)

1.更新数据时,一定要根据索引更新

2.列有索引的情况下,使用行锁,只锁住修改行,其他线程可以操作

3.列没有索引的情况下,会上升为表锁,锁住整张表,其他线程无法操作,影响性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值