sql limit不接具体数字_这21个写SQL的好习惯,你要养成呀

前言

每一个好习惯都是一笔财富,本文分SQL后悔药, SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~

公众号:「捡田螺的小男孩」

1. 写完SQL先explain查看执行计划(SQL性能优化)

日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。

explain select * from user where userid =10086 or age =18;

v2-1687a0e98511faa3d25be6e6d3a87c73_b.png

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

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

delete from euser where age > 30 limit 200;

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

v2-94149d35319093862a00cd7b2d038a0f_b.jpg
  • 「降低写错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='账户表';

「反例:」

CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`balance` int(11) DEFAULT NULL,`create_time` datetime NOT NULL ,`update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8;

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

「正例:」

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

「反例:」

SELECT stu.name, sum(stu.score) from Student stu WHERE stu.classNo = '1班' group by stu.name.

显然,统一关键字大小写一致,使用缩进对齐,会使你的SQL看起来更优雅~

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

「反例:」

insert into Student values ('666','捡田螺的小男孩','100');

「正例:」

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` (`name` varchar(255) DEFAULT NULL COMMENT '账户名',`balance` int(11) DEFAULT NULL COMMENT '余额',
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

「正例:」

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='账户表';

「理由:」

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

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

v2-27ba9c5e97ebfd13fa6d583650d29e6f_b.jpg

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

「反例:」

select * from user where address ='深圳' order by age ;

v2-3eeea3d7ba6f3c078f1da7ae2fe00505_b.jpg

「正例:」

添加索引
alter table user add index idx_address_age (address,age)

v2-d48a4efde8e92c79b310d8904ab06d18_b.jpg

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

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

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

「反例:」

//userid 是varchar字符串类型
select * from user where userid =123;

v2-5c3ec22ed36358e0c8bd245d450f8e66_b.jpg

「正例:」

select * from user where userid ='123';

v2-4a5050e4e1c635e00a5c8cc1094b8b42_b.jpg

「理由:」

  • 因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,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 * from employee;

「正例:」

select id,name from employee;

理由:

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

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

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

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

统一使用UTF8编码

  • 可以避免乱码问题
  • 可以避免,不同字符集比较转换,导致的索引失效问题

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

「反例:」

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

「正例:」

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

理由:

  • 因为首先变长字段存储空间小,可以节省存储空间。
  • 其次对于查询来说,在一个相对较小的字段内搜索,效率更高。

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

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

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

「正例:」

begin;
update account set balance =1000000
where name ='捡田螺的小男孩';
commit;

「反例:」

update account set balance =1000000
where name ='捡田螺的小男孩';

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的内置函数,索引失效

v2-8e46f2e1ae17a8a8f45039c65abba139_b.jpg

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

反例:

delete from account  limit 100000;

正例:

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

理由:

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

参考与感谢

  • [delete后加 limit是个好习惯么] (https://blog.csdn.net/qq_39390545/article/details/107519747)
  • 《阿里开发手册》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巅峰对决!Spring Boot VS .NET 6

Spring Boot 和 ASP.NET Core 都是企业中流行的 Web 框架, 对于喜欢 C# 的人会使用 ASP.NET Core, 而对于 Java 或 Kotlin 等基于 JVM 的语言&#xff0c;Spring Boot 是最受欢迎的。这本文中&#xff0c;会对比这两个框架在以下方面有何不同&#xff1a;•控制器•模型绑定和验…

java 生成无重复 随机数

2019独角兽企业重金招聘Python工程师标准>>> 一、实现逻辑 1.需要一个固定的数据集。 2.从数据集中随机去除当前索引的数据&#xff0c;并移除生成。并重复生成多个。 二、编码 import java.util.ArrayList; import java.util.Calendar; import java.util.List; imp…

最诡异航空事件,幽灵航班包括驾驶人员,所有人都在高空中昏睡!而后整机坠毁!...

全世界只有3.14 % 的人关注了爆炸吧知识2005年8月14日&#xff0c;一架塞浦路斯的太阳神航空&#xff08;Helios Airways&#xff09;波音737-300客机&#xff0c;班次ZU-522&#xff08;HCY 522&#xff09;&#xff0c;机身编号5B-DBY&#xff0c;机上载有59名成年人及8名儿童…

[激励机制]浅谈内部竞争——如何让你的员工玩命干活?

我是标题党&#xff0c;标题是故意气你的&#xff0c;千万表拍我。公元2012年12月12号&#xff0c;Clark 拿出所有积蓄创办了一个公司&#xff0c;招了看上去还不错的5个员工组成了一个小型团队。紧接着&#xff0c;摆在他面前的一个很明显的问题就是——如何让他们玩命干活&am…

mybatis 查询的时间不对_程序员,Mybatis 你踩过坑吗?

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;源码精品专栏 中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业…

李洪强iOS开发之- 实现简单的弹窗

李洪强iOS开发之- 实现简单的弹窗 实现的效果: 112222222222223333333333333333

.NET 编码的基础知识

点击上方蓝字关注我们.NET 编码的一些基本概念和分析简单的类型概念Hex &#xff08;16进制&#xff09;byte 字节 范围是&#xff1a;0~255&#xff0c;二进制下的范围就是00000000~11111111&#xff0c;相当于1字节。byte[] 字节数组bit 比特&#xff0c;只有2种状态&#xf…

什么是MVC?MVC框架的优势和特点

目录 一、什么是MVC 二、MVC模式的组成部分和工作原理 1、模型&#xff08;Model&#xff09; 2、视图&#xff08;View&#xff09; 3、控制器&#xff08;Controller&#xff09; 三、MVC模式的工作过程如下&#xff1a; 用户发送请求&#xff0c;请求由控制器处理。 …

docker没有下载完全_会用Docker的人都别装了,这多简单呐

学术又官方的说法Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。没用过的人能看懂这段话&#xf…

WPF MVVM实例三

在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识&#xff1a;WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的&#xff0c;WPF提供了数据绑定机制&#xff0c;当数据发生变化时&#xff0c;WPF会自动发出通知去更新UI。我们使用模式…

stringcstdlibctimecstdargctimectypecmathclimits

转载地址&#xff1a;http://blog.csdn.net/kz_ang/article/details/7767335 <string>头文件 string构造函数 string s  生成一个空字符串s string s(str)  拷贝构造函数,生成str对象的复制品 string s(str,stridx)  将字符串str对象内"始于位置stridx"…

C3P0 释放连接 的问题

2019独角兽企业重金招聘Python工程师标准>>> 记录一下使用C3P0 时犯的低级错误&#xff0c;没有关闭connection 达到连接池最大限制后造成程序假死的现象&#xff0c;以后得仔细再仔细了&#xff01; 转载于:https://my.oschina.net/fusxian/blog/146700

python随机抽取人名_python的random

python的random函数更多的random用法可参阅&#xff1a;random --- 生成伪随机数 - Python 3.7.4 文档​docs.python.org以下使用了&#xff1a;洗牌&#xff1a;random.shuffle随机抽取元素&#xff0c;且元素不重复&#xff1a;random.sample随机抽取元素&#xff0c;且元素可…

Windows 11/10 正式版全新 ISO 镜像下载

微软现已发布 Windows 11/10 正式版&#xff08;版本 21H2&#xff09;全新 ISO 镜像。Windows 11 版本 21H2 全新镜像集成了 2021 年 10 月更新、11 月更新和 12 月更新。Windows 10 版本 21H2 全新镜像集成了 2021 年 11 月更新和 12 月更新。版本区别Windows 11/10 消费者版…

java web filter 之一 基础实现

本文主要对filter的基本使用进行了讲解&#xff0c;其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 &#xff0c;能实现对java web程序 客户端和服务器端消息的过滤&#xff0c;也就是在服务器段接受reques…

eclipse索引4超出范围_Python内置的4个重要基本数据结构:列表、元组、字典和集合

本章内容提要&#xff1a;列表及操作元组及操作字典及操作集合简介第2章介绍了数字(整数、浮点数)、逻辑值和字符串等Python内置的基本数据类型。在实际的操作中&#xff0c;仅仅依赖它们很难高效地完成复杂的数据处理任务。基于对基本数据类型的构建&#xff0c;Python拓展出列…