1有主键
否则多次读写更多离散,增加更多io
mysql复制环境,若选择brb模式会update全表;导致延迟
2数据长度
够用前提,越短越好,消耗更少的存储空间;需要排序时候,消耗更少的内存
3每张表增加createtime 和updatetime两个时间
表示创建时间和更新时间;便于运维;判断哪些是老数据,便于归档,用来做自 定义的差异备份
4索引很重要
innodb行锁基于索引,如果没有索引导致1读取时,全表扫描;2修改时,全表记录锁
5所有where的条件都加上引号
避免潜在的类型隐式转换的类型;避免个别条件失效的sql语法错误;
6不select *
减少不必要的io;提高可以利用覆盖索引的几率
7避免sql注入的风险
所有用户的输入值都要做过滤;用prepare做预处理;利用sql_mode作品限制
8LIKe查询中不要用%的通配符在左侧;否则无法使用索引
9sql中尽量不要有运算;where字句中最好不要有函数
10 关于join
满足业务下 优先使用inner join 用优化器自动选择驱动表
11关于explain
关键业务上线前用explain确定执行计划;提前分析slow query log;explain中如果有using temporary,filesort或者type=all的时候应该优化;
可以提供1表的读取顺序2如何读取的表3那些可能用到的索引和实际用了那些索引4表示如何引用的5查询油画系从每个表中预计读取的记录数6其他信息 是否使用了内存表是否引发排序等
12 分而治之
把同一对象的 不用属性根据使用的多少可以建立成两个表 ;
把不变的数据一个表,变得一个表;计数单独一个表;
13 索引
确保 where on group by order by 这些字段在索引上
确保join的字段上有索引;而且索引类型保持一致;否则增加转换开销
索引覆盖:当select 所有的字段都在索引记录中,则不需要从表中查询数据直接从索引中返回
14 索引的效率
与执行计划相关的索引(出现在possible key)索引的数量与sql的执行消耗时间成正比,与执行计划无关的索引,不会影响sql的执行效率;表的大小与索引对于sql的执行效率的影响,没有直接的关系;与本条语句执行相关的index的数量(posible key)会影响最终的效率