本文整理自网络,侵删。
前言
每一个好习惯都是一笔财富,本文分 SQL 后悔药,SQL 性能优化,SQL 规范优雅三个方向,分享写 SQL 的 21 个好习惯和最佳实践!
写完SQL先explain查看执行计划(SQL性能优化)
日常开发写 SQL 的时候,尽量养成这个好习惯呀:写完 SQL 后,用 explain 分析一下,尤其注意走不走索引。
操作 delete 或者 update 语句,加个 limit(SQL后悔药)
在执行删除或者更新语句,尽量加上 limit,以下面的这条 SQL 为例吧:
delete from euser where age > 30 limit 200;
因为加了 limit 主要有这些好处:
1、降低写错 SQL 的代价,你在命令行执行这个 SQL 的时候,如果不加 limit,执行的时候一个不小心手抖,可能数据全删掉了,如果删错了呢?加了 limit 200,就不一样了。删错也只是丢失 200 条数据,可以通过 binlog 日志快速恢复的。
2、SQL 效率很可能更高,你在 SQL 行中,加了 limit 1,如果第一条就命中目标 return, 没有 limit 的话,还会继续执行扫描表。3、避免了长事务,delete 执行时,如果 age 加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
4、数据量大的话,容易把 CPU 打满,如果你删除数据量很大时,不加 limit 限制一下记录数,容易把 cpu 打满,导致越删越慢的。
设计表的时候,所有表和字段都添加相应的注释(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;
SQL书写格式,关键字大小保持一致,使用缩进。(SQL规范优雅)
正例:
SELECT stu.name, sum(stu.score)FROM Student stuWHERE 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 看起来更优雅~
INSERT语句标明对应的字段名称(SQL规范优雅)
反例:
insert into Student values ('666','业余草','100');
正例:
insert into Student(student_id,name,score) values ('666','业余草','100');
变更SQL操作先在测试环境执行,写明详细的操作步骤以及回滚方案,并在上生产前review。(SQL后悔药)
- 变更 SQL 操作先在测试环境测试,避免有语法错误就放到生产上了。
- 变更 Sql 操作需要写明详细操作步骤,尤其有依赖关系的时候,如:先修改表结构再补充对应的数据。
- 变更 Sql 操作有回滚方案,并在上生产前,review 对应变更 SQL。
设计数据库表的时候,加上三个字段:主键,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='账户表';
理由:
1、主键一定要加上的,没有主键的表是没有灵魂的
2、创建时间和更新时间的话,还是建议加上吧,详细审计、跟踪记录,都是有用的。
相关阅读 >>
sql server之select into 和 insert into select案例详解
更多相关阅读请进入《sql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。