数据库设计
表字段避免 null 值出现,null 值很难查询优化且占用额外的索引空间,推荐默认数字 0 代替 nullMySQL 。
尽量使用 INT 而非 BIGINT,如果非负则加上 UNSIGNED(这样数值容量会扩大一倍),当然能使用 TINYINT、SMALLINT、MEDIUM_INT 更好MySQL 。
使用枚举或整数代替字符串类型MySQL 。
尽量使用 TIMESTAMP 而非 DATETIMEMySQL 。
单表不要有太多字段,建议在 20 以内MySQL 。
用整型来存 IPMySQL 。
索引设计
索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描MySQL 。
应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描MySQL 。
值分布很稀少的字段不适合建索引,例如 "性别" 这种只有两三个值的字段MySQL 。
字符字段只建前缀索引MySQL 。
字符字段最好不要做主键MySQL 。
不用外键,由程序保证约束MySQL 。
尽量不用 UNIQUE,由程序保证约束MySQL 。
使用多列索引时注意顺序和查询条件保持一致,同时删除不必要的单列索引MySQL 。
使用可存下数据的最小的数据类型MySQL ,整型 < date,time < char,varchar < blob*
使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂MySQL 。如,int 类型存储时间类型,bigint 类型转 ip 函数。
使用合理的字段属性长度,固定长度的表会更快MySQL 。使用 enum、char 而不是 varchar。
尽可能使用 not null 定义字段MySQL 。
尽量少用 text,非用不可最好分表MySQL 。
查询频繁的列,在 where,group by,order by,on 从句中出现的列MySQL 。
where 条件中 <,<=,=,>,>=,between,in,以及 like 字符串 + 通配符(%)出现的列MySQL 。
长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好MySQL 。
离散度大(不同的值多)的列,放在联合索引前面MySQL 。查看离散度,通过统计不同的列值来实现,count 越大,离散程度越高。