为了写好SQL,我养成了这些习惯

2022-05-05 19:00:58 浏览数 (1)

在开发中自己SQL一直写得很随便,为了提升自己的SQL水平,我在写SQL时强迫自己做这些操作,并养成习惯。

使用EXPLAIN执行计划检查是否使用到索引

我们在写SQL的时候,可能会遇到查询缓慢,SQL索引失效的情形。如果我们的字段有使用索引,那么在查询的时候尽量要让索引用上。因此在写完SQL时,用EXPLAIN执行计划去检验一下。

代码语言:javascript复制
EXPLAIN SELECT sn FROM xxx_xxx_verify;

在做批量删除和批量更新时限制条数

你是否在给数据做批量删除和批量更新的时候瑟瑟发抖,生怕修改错数据。我们可以再批量操作时在SQL后面加上limt来限制条数,尽量小批量执行。

代码语言:javascript复制
DELETE FROM xxx_sale_xxx_sn LIMIT 1,20;

这样做了限制再也不怕手抖了,就算误删或者误修改也容易恢复。

设计表的时候,一定要有注释

这个不用说,表字段一定要有注释,不然你自己都看不懂。特别是状态字段要写清楚有哪些状态,例如

代码语言:javascript复制
 `expected_xxxx_ways` varchar(18) NOT NULL COMMENT '计划xxx方式:LOCAL-当地xxx;TRANSFER_HOUSEHOLDS-转籍xxx',

如果只写

代码语言:javascript复制
 `expected_xxxx_ways` varchar(18) NOT NULL COMMENT '计划xxx方式'

这样我们就不知道,有哪些方式,每种方式分别用什么表示。

插入语句要写明插入字段的名称

我们写插入语句一定要写对应字段名称,不然就很难复查插入的数据是否正确。例如:

代码语言:javascript复制
INSERT INTO `sys_xxx` (`ID`, `RULE_NAME`, `PREFIX`, `POSTFIX`, `SN`, `S_MONTH`, `S_YEAR`, `S_LENGTH`, `S_LOOP`, `DESCRIPTION`, `CREATED_BY`, `CREATED_DATE`, `IS_ACTIVE`, `UPDATED_BY`, `UPDATED_DATE`) VALUES ('67', 'sale_transfer', 'BXS', NULL, '0', '3', 'xxxx', '3', '1', 'xxxx', 'admin', 'xxxx', '0', NULL, NULL);

这样我能知道每个数据值对应的字段,如果这样写:

代码语言:javascript复制
INSERT INTO `sys_xxx` VALUES ('67', 'sale_transfer', 'BXS', NULL, '0', '3', 'xxxx', '3', '1', 'xxxx', 'admin', 'xxxx', '0', NULL, NULL);

当数据插入有问题时,排查就比较麻烦了。

设计表时要有create_time,update_time

这个在实际开发中是必要的,我们需要这几个字段。业务中往往会有根据创建时间或者更新时间排序。或者在排查问题时也知道这条问题数据的生成时间,当前除了时间字段,我们还会添加create_by,update_by创建人和更新人字段。还会有删除标识字段,因为很多业务都只要求逻辑删除,所以业务中还需要有这个删除标识字段。

代码语言:javascript复制
CREATE TABLE `xxx_sale_xxx_sn` (
    `id` varchar(18) NOT NULL COMMENT '主键',
    ...
    `create_by` varchar(20) DEFAULT NULL COMMENT '创建者',
    `create_date` datetime DEFAULT NULL COMMENT '创建时间',
    `is_active` char(2) DEFAULT NULL COMMENT '删除标识',
    `update_by` varchar(20) DEFAULT NULL COMMENT '更新人',
    `update_date` datetime DEFAULT NULL COMMENT '更新日期',
     PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxxx单';

建议使用字符集utf8mb4创建表

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

原来MySQL支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 unicode 字符是 0xffff,也就是 unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 unicode字符,都无法使用 MySQL 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 unicode 编码,常见于 iOS 和 Android 手机上),和很多不常用的汉字,以及任何新增的 unicode 字符等等(utf8的缺点)。

0 人点赞