- 不使用 count(列名)或 count(常量)来替代 count(*)
count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行 - 当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为NULL,因此使用 sum()时需注意 NPE 问题
避免 sum 的 NPE 问题:SELECT IFNULL(SUM(column), 0) FROM table; - 使用 ISNULL()来判断是否为 NULL 值
ISNULL(column)`是一个整体,简洁易懂。性能 更好。 - 代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句
- 不得使用外键与级联,一切外键概念必须在应用层解决
外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。 - 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 - 对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定
举例:select t1.name from table_one as t1 , table_two as t2 where t1.id=t2.id; - in 操作能避免则避免,要使用的话,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内
- 字符存储与表示,要采用 utf8 字符集,那么字符计数方法需要注意
SELECT LENGTH(“世界你好”); 返回为 12
SELECT CHARACTER_LENGTH(“世界你好”); 返回为 4
如果需要存储表情,那么选择 utf8mb4 来进行存储,注意它与 utf8 编码的区别。 - TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句