索引
主键 pk_xxx
唯一 uk_xxx
普通索引 idx_xxx
业务上具有唯一性的字段(包括组合字段),必须建立唯一索引;索引带来的写的性能损失可以忽略不计,但是读性能提升是显而易见的;
根据墨菲定律,无论应用层如何保证唯一性,也不能绝对保证唯一性
varchar建立索引时,必须制定索引长度,字符串20索引长度,区分度已经达到90%以上,这样可以解决索引
左模糊和全模糊对索引失效
%keyword
%keyword %
只有右模糊索引才有效 keyword%,因为b-tree最左前端匹配特性
布尔值存储
if_xxx 类型是unsigned tinyint
小数存储
金额的存储,一般转换为分后,使用bigint
其他小数使用decimal不能用float和double,因为精度损失问题,如果超过decimal,则需要将整数和小数部分分开存放
字符存储
varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长
度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
表规约
表必要字段
id
create_time
update_time
命名表名
t_业务名_表示动作
t_order_record
t_file_record
分库分表我们几乎很难涉及,不装逼
单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
性能规范
禁止3个表join(只能多次应用层读取了),join字段类型必须完全一致,关联字段建立索引
in控制在1000以内
不准使用 select * ,必须指明字段名称
易忽略的sql问题
count(列名) 不会统计NULL
count(*) 会统计NULL
判断是否为NULL,使用ISNULL()
NULL <> NULL
NULL == NULL
NULL <> 1
返回都是NULL,而不是false、true
谨慎使用${},会出现sql注入攻击
易调试性
不要使用外键与级联,外键的概念在应用层解决
级联含义:学生表中的 student_id是主键,那么成绩表中的 student_id则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新, 即为级联更新
不准使用存储过程,很难移植和调试
其他
不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出,即不能作为mybatis中resultType返回值
说明: resultClass=”Hashtable”, 会置入字段名和属性值,但是值的类型不可控