MySQL 的 21 个规范、优化最佳实践!


本文整理自网络,侵删。

前言

每一个好习惯都是一笔财富,本文分 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学习基础之内存初探

sql语言具有的功能

oledb和odbc的区别(优缺点)

sql server和mysql的区别是什么

sql server之select into 和 insert into select案例详解

条件数据库androidsqllite的简单使用

mysql优化之如何写出高质量sql语句

sql存储过程的写法是什么

sql server 中查看sql句子执行所用的时间

sql求和语句怎么写?

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...