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.列没有索引的情况下,会上升为表锁,锁住整张表,其他线程无法操作,影响性能