首页 > 数据库 >SQL优化

SQL优化

时间:2022-11-13 12:23:47浏览次数:35  
标签:count id 索引 SQL 排序 优化 主键

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

相关文章

  • MySQL基础笔记
    目录创建和查看数据库2修改和查看数据库字符集2创建表createtable+表名5删除表droptable+表名6展示创建表格showcreatetablecustomer;8复制表格create......
  • mysql主从复制
    主库配置【ip:192.168.1.220】1、修改Mysql数据库的配置文件/etc/my.cnf在最下面增加配置log-bin=mysql-bin#[必须]启用二进制日志server-id=200#[必须]服......
  • 抓包整理————tcp 三次握手性能优化[十]
    前言tcp三次握手性能优化。正文服务器三次握手流程示例:下面就是3次握手的过程:知道这个有什么用呢?我举一个我使用到的例子哈。比如有很多tcp连接到一台机器上......
  • MySQL 根据经纬度计算距离
    CREATEFUNCTION`fun_get_distance`(`myLongitude`DECIMAL(20,15),`myLatitude`DECIMAL(20,15),`sysLongitude`DECIMAL(20,15),`sy......
  • 学习笔记-java代码审计-sqli
    Java代码审计-sqli0x01漏洞挖掘jdbc在上古时期,人们往往这么从数据库获取数据。publicUsergetUserById(Stringid)throwsSQLException{Connectionconnectio......
  • MySql悲观锁(行锁)和乐观锁
    原文网址:https://blog.csdn.net/weixin_45433031/article/details/120838045什么是乐观锁,什么是悲观锁?一、并发控制当程序中可能出现并发的情况时,就需要保证在并发情况......
  • EF查看SQL2种方式 和 映射
    原文网址:https://www.cnblogs.com/wangdash/p/12342471.html///EF查看SQL2种方式///1.通过数据库的sqlprofiler///2.context.Dat......
  • Mysql8.0本地Datagrip失败--时区
    新版的Mysql中的时区默认设置与本地时区之间是不同的,因此会报错。由此,解决方法即为修改时区设置即可 ?serverTimezone=UTC ......
  • SQL语句查询优化方法
    建立索引并命中索引,在查询的时候,要尽量让数据库引擎使用索引。加入explain执行计划1.尽量避免使用select*2.尽量避免使用!=3.尽量避免使用or优化方式:可以用unio......
  • mysql 优化分表 存储引擎
    分表--创建key分表createtableuser1(uidintauto_incrementprimarykey,unamevarchar(20)notnull)engine=myisamdefaultcharset=utf8partitionbykey(ui......