使用约定
-
不使用存储过程
-
不使用自定义的函数, 尽量不使用MySQL的函数
-
不使用触发器
-
不使用全文索引
-
不使用分区表
-
不使用多表查询, 禁用JOIN
-
不使用 * , SELECT使用具体的列名
- 开发时不会因为使用*而显著缩短开发时间和设计时间
- 还能减少QUERY RT
- 在发生列的增/删时, 发生列名修改时, 最大限度避免程序逻辑中没有修改导致的BUG
- 后续很多工具需要依赖于此
-
所有的SQL, 必须强制带上 LIMIT $RowCount
- RowCount尽量地小. RowCount <= 10,000 (暂时)
- RowCount对于一个归一化的SQL是可以枚举的少量具体值
-
出现大批量操作的导数据/变更数据必须分批进行. 比如示例:
- SELETE
table
WHEREUpdated
> 20001001 LIMIT 2000 - UPDATE
table
... WHEREId
= ? LIMIT 1 - DELETE FROM
table
WHEREId
= ? LIMIT 1 - UPDATE
table
... WHEREId
> ? LIMIT 30 - DELETE FROM
table
WHEREId
> ? LIMIT 1000
- SELETE
-
查找记录是否存在, 可以使用SELECT 1
-
判断Server是否健康, 可以使用: SELECT UNIX_TIMESTAMP();
-
大SQL拆成多个小SQL, 增加缓存命中率和提高CPU利用率(降低IOWait)
-
禁止在MySQL Server端做运算, md5() rand()等, 在索引列中作运算, 不会使用索引
-
禁止IN的元素个数超过100. 建议个数: 30 or 50
-
禁止使用%前缀模糊查询
-
禁止使用子查询
-
分页如果有大OFFSET, 可以先取Id, 然后用IN取结果集, 会提高效率
-
区别 COUNT(1) COUNT(*) COUNT(
Id
)- 限制: 在SSD / PCIeFlush下, 行数 >= 1,000,000 , 禁止在高流量下使用 COUNT函数
- 限制: 在SAS 下, 行数 >= 500,000 , 禁止在高流量下使用 COUNT函数
数据订正
执行DELETE/UPDATE, 一定要加上LIMIT 1, 确定只操作一行. 相关的SQL,一定找人(水平相当或更好的)做好DoubleCheck
网友评论