首页 > 数据库 >16条MySQL使用规范

16条MySQL使用规范

时间:2023-03-13 13:13:24浏览次数:37  
标签:name 16 SQL 规范 查询 索引 MySQL where select

 

1. 禁止使用select *

阿里开发规范中,有这么一句话:

image

**select *** 会查询表中所有字段,如果表中的字段有更改,必须修改SQL语句,不然就会执行错误。

查询出非必要的字段,徒增磁盘IO和网络延迟。

2. 用小表驱动大表

关联查询的时候,先用小表查到结果,再用结果去大表查询,可以大大减少连接次数。

比如我们要查询某个部门下的员工,由于部门数量远远小于员工数量。我们可以把部门表当作驱动表,员工表当作被驱动表。

查询SQL类似这样:

select * from department
inner join employee
on department.id=employee.department_id
where department_name='部门1';

3. join关联表不宜过多

join关联表禁止超过3张,join关联过多,不但会增加查询时间,降低查询性能,还会产生临时表缓存结果数据,推荐拆成多条小SQL执行。

另外关联字段的类型一定要保持一致,并且在每张表都要建立关联字段的索引。

4. 禁止使用左模糊或者全模糊查询

当我们在SQL查询使用左模糊或者全模糊匹配的时候,类似下面这样:

# 左模糊查询
select * from user where name='%一灯';
# 全模糊查询
select * from user where name='%一灯%';

根据B+树的特性,即使我们在name字段上建立了索引,查询的时候也是无法用到索引的。

5. 索引访问类型至少达到range级别

索引访问类型常见的有这几个级别,从上到下,性能由好到差。

image

要求SQL索引访问类型至少要达到range级别,最好到const级别。

6. 更优雅的使用联合索引

由于联合索引有最左匹配原则,所以需要优先把区分度高的字段放在最左边第一列。

比如要统计用户表中生日字段和性别字段区分度,可以这样统计:

select 
    count(distinct birthday)/count(*), 
    count(distinct gender)/count(*) 
from user;

image

值越大,区分度越高。

出道面试题,下面这条SQL该怎么创建联合索引:

select a from table_name where b=1 order by c;

SQL中用到abc三个字段,创建联合索引的顺序是(b,c,a)

这道题还涉及到另一个知识点,SQL执行的顺序:

from > on > join > where > group by > having > select > distinct > order by > limit

7. 注意避免深分页

MySQL深分页的时候,查询性能较差。

select * from user where name='一灯' limit 10000,10;

我们可以采用子查询的方式进行优化:

select * from user 
where id in (
  select id from user 
  where name='一灯'
  limit 10000,10
);

这样可以减少非聚簇索引回表查询的次数。

8. 单表字段不要超过30个

当单表字段数量过多的时候,加载大量数据也会拖慢查询性能。

如果字段超过30个,不用看,肯定是表设计的不合理。

这时候,可以拆成多张表,用垂直分表的方式,进行冷热字段分离。

9. 枚举字段不要使用字符类型

字符类型会占用更多的存储空间,当我们想要存储枚举值或者表示是否的时候,可以采用tinyint数值类型,最好采用无符号整数unsigned tinyint

10. 小数类型禁止使用float和double

在存储和计算的时候,float 和 double 都存在精度损失的问题,无法得到正确的结果。

所以在涉及到存储小数的时候,必须使用decimal类型。

11. 所有字段必须设置默认值且不允许为null

字段允许为null,会占用额外的存储空间。

索引并不会索引null值,所以查询null值的时候无法用到索引。

当数值类型允许为null,返回给映射实体类的时候还可能会报空指针异常。

12. 必须创建主键,最好是有序数值类型

如果我们自己没有给表设置主键,InnoDB会自动增加一列隐藏的主键,我们无法使用到,并且也占用的更多的存储空间,所以建表的时候,必须设置主键。

有序数值更适合做主键,插入数据的时候,由于是有序的,不会频繁调整B+树结构,性能更好。

13. 快速判断是否存在某条记录

一般我们判断表中是否存在某条记录的时候,会使用count函数,然后判断返回值是否大于1。

select count(*) from user where name='一灯';

InnoDB存储引擎并没有像MyIsAm那样缓存表的总行数,每次查询都是实时计算的,耗时较长。

我们可以采用limit加快查询效率:

select id from user where name='一灯' limit 1;

limit 1表示匹配到一条就返回,查询效率更好,结果集只返回id,还可以用到覆盖索引。

14. in条件中数量不宜过多

in条件中数量不要超过1000个,不然耗时会非常长,可以拆成多批次查询。

15. 禁止创建预留字段

无法通过预留字段的名称判断这个字段是干嘛用的。

预留字段的类型不一定合适。

无法为预留字段创建合适的索引。

16. 单表索引数不要超过5个

创建适当的索引可以提高查询效率,但是过多的索引,不但占用更多存储空间,还会拖慢更新SQL的性能。

所以,索引好用,适度即可。

知识点总结:

image

转载自作者:一灯架构

来源:https://www.cnblogs.com/yidengjiagou/p/16545435.html

标签:name,16,SQL,规范,查询,索引,MySQL,where,select
From: https://www.cnblogs.com/mihutao/p/17210981.html

相关文章

  • [转载from jayant97]nRF9160与nRF Cloud 超详细入门攻略
    原文链接:nRF9160与nRFCloud超详细入门攻略1.产品简介1.1.nRFCloud​ nRFCloud是NordicSemiconducotr公司在AWS上搭建的IoT平台,提供设备注册(CloudProvisioning......
  • 16
    建立一套以数据采集为基础,数据分析、统计、管控为核心的综合性能源管理系统,详细需求描述如下:1、数据收集功能:生产区域以车间为主体,通过计量仪表远程收集蒸汽、冷凝水、电......
  • mysql优化策略
    1看一下能不能加缓存解决,是不是周期性的卡顿,是否需要调整缓存失效策略2开启慢查询日志,看看是sql执行的时间长还是sql等待的时间长查看慢查询日志setgloballong_que......
  • 7.mysql定时删除60天前的数据
    1.查看even_schedule是否开启,如果没开启,使用下面命令开启,阿里云服务器需要在管理后台开启SETGLOBALevent_scheduler=ON; 2.创建PROCEDURE存储过程DROPPROCEDUREIF......
  • MySQL模糊查询like优化方案
    索引失效的解决方案在MySQL中,模糊查询肯定要使用LIKE关键字,然后再加%,是代表前模糊还是后模糊。数据量小的情况下,不容易看出查询的效率,但是数据量达到百万级,千万级甚......
  • 傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)
    傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)注释都是由chatGPT生成,有什么问题可以评论交流@Value("${backup.sql.database}")privateStringdatabases;......
  • 转载自 https://blog.csdn.net/m0_52165864/article/details/126218082
    Linux系列之系统监控命令 目录1、top命令的使用1、系统统计信息2、系统进程信息2、free命令使用:内存3、df命令的使用:磁盘4、ps命令的使用5、crontab命令6、查看端口的......
  • [docker] 腾讯云启用 mysql 容器
    dockerrun-itd--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456mysql:5.7参数说明:-p3306:3306:映射容器服务的3306端口到宿主机的3306端口,外部主机可......
  • linux中mysql8重置root密码
    修改my.cnf,修改参数,使登录能够跳过密码验证servicemysqldrestart,重启mysqld服务mysql-uxxx-p,任意账号无密码可进入重置root密码为空quit;修改my.cnf,删除跳过验证......
  • mysql elt interval函数区间统计
    引言 在实际的业务统计需求中有时往往需要对区间进行分组统计查询,如分数区间,工资区间查询统计等!mysql中可以利用elt函数来实现此类需求!接下来看如下时间业务需求:......