推广

MySQL干货!21个写SQL的好习惯

iseeyu2年前 (2024-02-21)推广135

image.png

2、操作delete或者update语句,加个limit(SQL后悔药)

在执行删除或者更新语句,尽量加上limit,以下面的这条 SQL 为例吧:

delete from euser where age > 30 limit 200;

因为加了limit 主要有这些好处:

image

  • 「降低写错SQL的代价」, 你在命令行执行这个SQL的时候,如果不加limit,执行的时候一个「不小心手抖」,可能数据全删掉了,如果「删错」了呢?加了limit 200,就不一样了。删错也只是丢失200条数据,可以通过binlog日志快速恢复的。
  • 「SQL效率很可能更高」,你在SQL行中,加了limit 1,如果第一条就命中目标return, 没有limit的话,还会继续执行扫描表。
  • 「避免了长事务」,delete执行时,如果age加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
  • 「数据量大的话,容易把CPU打满」 ,如果你删除数据量很大时,不加 limit限制一下记录数,容易把cpu打满,导致越删越慢的。

3. 设计表的时候,所有表和字段都添加相应的注释(SQL规范优雅)

这个好习惯一定要养成啦,设计数据库表的时候,所有表和字段都添加相应的注释,后面更容易维护。如下例子:

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

4. SQL书写格式,关键字大小保持一致,使用缩进。(SQL规范优雅)如下例子:

SELECT stu.name, sum(stu.score)
FROM Student stu
WHERE stu.classNo = '1班'
GROUP BY stu.name

5. INSERT语句标明对应的字段名称(SQL规范优雅)

insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');
6. 变更SQL操作先在测试环境执行,写明详细的操作步骤以及回滚方案,并在上生产前review。(SQL后悔药)

变更SQL操作先在测试环境测试,避免有语法错误就放到生产上了。
变更Sql操作需要写明详细操作步骤,尤其有依赖关系的时候,如:先修改表结构再补充对应的数据。
变更Sql操作有回滚方案,并在上生产前,review对应变更SQL。

7.设计数据库表的时候,加上三个字段:主键,create_time,update_time。(SQL规范优雅)

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

「理由:」

  • 主键一般都要加上的,没有主键的表是没有灵魂的
  • 创建时间和更新时间的话,还是建议加上吧,详细审计、跟踪记录,都是有用的。

阿里开发手册也提到这个点,如图

image

8. 写完SQL语句,检查where,order by,group by后面的列,多表关联的列是否已加索引,优先考虑组合索引。(SQL性能优化)

image.png

image.png

9.修改或删除重要数据前,要先备份,先备份,先备份(SQL后悔药)

如果要修改或删除数据,在执行SQL前一定要先备份要修改的数据,万一误操作,还能吃口「后悔药」~

10. where后面的字段,留意其数据类型的隐式转换(SQL性能优化)

select * from user where userid ='123';

image.png

「理由:」

因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较,最后导致索引失效

11. 尽量把所有列定义为NOT NULL(SQL规范优雅)

「NOT NULL列更节省空间」,NULL列需要一个额外字节作为判断是否为 NULL 的标志位。
「NULL列需要注意空指针题」,NULL列在计算和比较的时候,需要注意空指针问题。

12.修改或者删除SQL,先写WHERE查一下,确认后再补充 delete 或 update(SQL后悔药)

尤其在操作生产的数据时,遇到修改或者删除的SQL,先加个where查询一下,确认OK之后,再执行update或者delete操作

13.减少不必要的字段返回,如使用select <具体字段> 代替 select * (SQL性能优化)

select id,name from employee;

「理由:」

节省资源、减少网络开销。
可能用到覆盖索引,减少回表,提高查询效率。

14.所有表必须使用Innodb存储引擎(SQL规范优雅)

Innodb 「支持事务,支持行级锁,更好的恢复性」,高并发下性能更好,所以呢,没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎

15.数据库和表的字符集尽量统一使用UTF8(SQL规范优雅)

尽量统一使用UTF8编码

可以避免乱码问题
可以避免,不同字符集比较转换,导致的索引失效问题
「如果需要存储表情,那么选择utf8mb4来进行存储,注意它与utf-8编码的区别。」

16. 尽量使用varchar代替 char。(SQL性能优化)

`deptName` varchar(100) DEFAULT NULL COMMENT '部门名称'

因为首先变长字段存储空间小,可以节省存储空间。

17. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。(SQL规范优雅)

这个点,是阿里开发手册中,Mysql的规约。你的字段,尤其是表示枚举状态时,如果含义被修改了,或者状态追加时,为了后面更好维护,需要即时更新字段的注释。

18. SQL命令行修改数据,养成begin + commit 事务的习惯(SQL后悔药)

begin;
update account set balance =1000000
where name ='cherich';
commit;

19. 索引命名要规范,主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ;普通索引名则为 idx _字段名。(SQL规范优雅)

说明:pk_即primary key;uk_即unique key;idx_即index 的简称。

20. WHERE从句中不对列进行函数转换和表达式计算

假设loginTime加了索引
反例:

select userId,loginTime 
from loginuser
where Date_ADD(loginTime,Interval 7 DAY) >=now();

正例:

explain  select userId,loginTime 
from loginuser 
where  loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY);

索引列上使用mysql的内置函数,索引失效

21.如果修改/更新数据过多,考虑批量进行

反例:

delete from account  limit 100000;

正例:

for each(200次)
{
    delete from account  limit 500;
}

理由:

大批量操作会会造成主从延迟。
大批量操作会产生大事务,阻塞。
大批量操作,数据量过大,会把cpu打满。

希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57501.html

相关文章

案例复盘:5个方面告诉你如何持续输出价值打造“3高”社群。

案例复盘:5个方面告诉你如何持续输出价值打造“3高”社群。

我今天要分享的主题是《如何持续输出价值,打造“3高”社群》,何为三高,即高质量、高活跃、高链接,下面我会从下面5个方面告诉你,我是怎么做的,才能做到如此。 一、社群定位:你是不是在偏离目标? 当初自己建立运营社群,目的很简单:想聚集一群在线教育和知识付费的运营和产品同学,...

Flutter环境安装-iOSer

Flutter环境安装-iOSer

image.png SDK存放、配置环境变量 存到到根目录下面得opt /opt/ image.png 配置环境 在~/.bash_profile里面修改 在home目录下面的 #Flutter 镜像配置 export PUB_HOSTED_URL=https...

全网营销是什么?整合营销怎么做?

全网营销是什么?整合营销怎么做?

是什么?整合营销怎么做?随着互联网时代的到来,经济被互联网带动起来了,而全网营销可能已成为众多企业追逐的对象。但也有人会问,全网营销是什么?很多企业因为跟不上时代的节奏,在寻找全新的出路,在寻找的路上,也走了很多弯路。那么全网天下徐国祥就想告诉大家全网营销就能够帮助企业提高...

脉轮入门简明教程,脉轮的奥秘都在这里

《人体能量学的缘起》提及了古埃及的能量医学,可惜已失传。未来也是能量医学的天地,目前能找到的切入点,主要有两个:一个是古中医体系的经络系统,一个是古印度医学体系的脉轮系统。在《人体能量学-经络篇》里,已通过20篇文章探讨了经络的奥秘。本文算是《人体能量学-脉轮篇》的总结吧,...

我来教你如何做好品牌推广(如何做好品牌推广工作)

我来教你如何做好品牌推广(如何做好品牌推广工作)

现在,大多数企业已经认识到品牌的重要性,如何提高自身企业的品牌知名度,也成为了大多数企业老板关心的问题。其中大多数企业不知道怎样进行,接下来,云裂变品牌推广专家将向企业介绍如何提高企业的知名度,让更多消费者了解企业,从而使消费者达到对企业认可与信赖。 云裂变是专业的品牌推广服务商,主要服...

分享企业该如何走进全网营销时代。

分享企业该如何走进全网营销时代。

对于企业而言,选择一种适合企业自身发展的营销模式,在市场开拓和渠道建设时期是非常重要的。现如今,随着网络的发展,企业之间的竞争也越来越激烈,全网营销成为当今企业的优先之选。 做任何事情都要讲究时机,企业做网络推广也要选择恰当的时间,比如说5年前做百度搜索和现在做效果肯定天壤之别,因为那是...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片