SQL 开发规范
本章将介绍一些使用 SQL 的一般化开发规范。
建表删表规范
- 基本原则:表的建立在遵循表命名规范前提下,建议业务应用内部封装建表删表语句增加判断逻辑,防止业务流程异常中断。
- 详细说明:
create table if not exists table_name
或者drop table if exists table_name
语句建议增加 if 判断,避免应用侧由于 SQL 命令运行异常造成的异常中断。
SELECT * 使用规范
- 基本原则:避免使用 SELECT * 进行查询。
- 详细说明:按需求选择合适的字段列,避免盲目地 SELECT * 读取全部字段,因为其会消耗网络带宽。考虑将被查询的字段也加入到索引中,以有效利用覆盖索引功能。
字段上使用函数规范
- 基本原则:在取出字段上可以使用相关函数,但是在 Where 条件中的过滤条件字段上避免使用任何函数,包括数据类型转换函数,以避免索引失效。或者可以考虑使用表达式索引功能。
详细说明:
不推荐的写法:
SELECT gmt_create
FROM ...
WHERE DATE_FORMAT(gmt_create, '%Y%m%d %H:%i:%s') = '20090101 00:00:00'
推荐的写法:
SELECT DATE_FORMAT(gmt_create,'%Y%m%d %H:%i:%s')
FROM ...
WHERE gmt_create = str_to_date('20090101 00:00:00', '%Y%m%d %H:%i:%s')
其他规范
- WHERE 条件中不要在索引列上进行数学运算或函数运算。
- 用 in/union 替换 or,并注意 in 的个数小于 300。
- 避免使用 %前缀进行模糊前缀查询。
- 如应用使用 Multi Statements 执行 SQL,即将多个 SQL 使用分号连接,一次性地发给客户端执行,TiDB 只会返回第一个 SQL 的执行结果。
- 当使用表达式时,检查其是否支持计算下推到存储层的功能 (TiKV、TiFlash),否则应有预期 在 TiDB 层需要消耗更多内存、甚至 OOM。计算下推到存储层的功能列表如下: