在开发中自己SQL一直写得很随便,为了提升自己的SQL水平,我在写SQL时强迫自己做这些操作,并养成习惯。
使用EXPLAIN执行计划检查是否使用到索引
我们在写SQL的时候,可能会遇到查询缓慢,SQL索引失效的情形。如果我们的字段有使用索引,那么在查询的时候尽量要让索引用上。因此在写完SQL时,用EXPLAIN执行计划去检验一下。
代码语言:javascript复制EXPLAIN SELECT sn FROM xxx_xxx_verify;
在做批量删除和批量更新时限制条数
你是否在给数据做批量删除和批量更新的时候瑟瑟发抖,生怕修改错数据。我们可以再批量操作时在SQL后面加上limt
来限制条数,尽量小批量执行。
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
创建人和更新人字段。还会有删除标识字段,因为很多业务都只要求逻辑删除,所以业务中还需要有这个删除标识字段。
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
。好在utf8mb4
是utf8
的超集,除了将编码改为utf8mb4
外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
原来MySQL支持的 utf8
编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 unicode
字符是 0xffff,也就是 unicode
中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 unicode
字符,都无法使用 MySQL 的 utf8
字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 unicode
编码,常见于 iOS 和 Android 手机上),和很多不常用的汉字,以及任何新增的 unicode
字符等等(utf8
的缺点)。