insert优化
一:采用批量插入
二:采用手动提交事务
三:主键顺序插入
四:大批量插入数据,使用load
主键优化
一、数据组织方式
在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,被称为索引组织表。
一:页分裂
页可以为空,也可以填充一半或全部。每个页包含了2-N行数据(如果一行数据大,则会行溢出),且根据主键排列
二、页合并
当删除一条记录时,实际上没有被物理删除,只是记录被标记为删除并且他的空间允许被其他记录使用
当页中删除的记录达到MERGE_THRESHOLD(默认页的50%),innoDB会寻找最靠近的页进行合并以优化空间使用
三、主键设计原则
满足业务需求的情况下,尽量降低主键的长度
插入数据时,尽量选择顺序插入,选择使用auto_increment自增主键
尽量不要使用uuid做主键或是其他自然主键,如身份证号
业务操作时,避免对主键的修改
order by优化
一、using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是 通过索引直接返回排序结果的排序都叫filesort排序
二、using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高
两者体现在,加了explain关键字的sql语句中的extra字段上。
注意:
根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
尽量使用覆盖索引
多字段排序,一个升序一个降序,要注意联合索引在创建时的规则
create index idx_user_age_phone_ad on tb_user (age asc, phone desc)
如果不可避免的出现filesort,大数据量排序时,可以适当增加缓冲区大小
group by优化
在分组操作时,可以通过索引来提高效率
分组操作时,索引的使用也是蛮子最左前缀法则的
limit优化
一个常见又头疼的问题就是limit 200000,10 ,此时需要MySQL排序前200010记录,却仅仅返回200000-200010的记录,其他记录丢弃,查询排序的代价非常大
优化思路,一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询的形式进行优化
例: explain select s.*
from tb_sku s,(select id from tb_sku order by id limit 200000,10) a
where s.id = a.id
count优化
count的用法:
count(主键)遍历整张表,并把主键id值都取出来,返回给服务层,服务层进行累加
count(字段)
该字段没not null约束,则取每一行的字段值并返回给服务层,服务层判断null之后进行计数累加
有not null约束,则取每一行的字段值并返回给服务层,直接计数累加
count(1)遍历整张表但不取值,服务层对于返回的每一行,添加数字1进去,直接按行计数累加
count(*)不取所有字段,直接计数累加
性能:count(字段)<count(主键)<count(1)≈count(*),尽量使用count(*)
update优化
InnDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行级锁升级为表锁
标签:count,id,索引,SQL,排序,优化,主键 From: https://www.cnblogs.com/Fei-Gao/p/16884250.html