1,数据库设计方面:
a,UTF-8的字符集是⼀一个汉字3个字节:varchar(255) UTF-8 255*3=765字节
b,禁⽌在表中建立预留字段
c,尽量避免加⼊外键约束,因为外键写入的时候会降低存储效率,但要给这些关联字段加索引
2,索引设计方面:
a,单张表索引数量建议不不超过5个,如果列列多可以适当增加
b,每个innodb表都必须有一个主键,innoDB表就是一个索引组织表,实际存储顺序只能有一种,innoDB是按照主键进⾏存放的
c,不能使⽤更新频繁的列和联合索引做主键,主键不断变,数据的存放顺序就会不断变化
d,不要使⽤UUID、MD5、HASH等做主键,不能保证这些值是按顺序增长的。如果⽣成较⼩的 字符串就会导致不断变化数据存储的位置,影响I/O性能
e,避免建⽴立冗余和重复索引
f,对于频繁查询的数据列列,优先考虑使⽤用覆盖索引
3,数据库SQL开发方面:
a,在程序中使用PrepareStatement,#{}。既可以降低词法和语法分析器的重复执行,还能防止SQL注入
b,合理充分的利用表上的索引,使用left join或not exists来优化not in
c,连接不同的数据库使用不同的账号,禁止跨库操作。
d,禁止使用select *,不能使用覆盖索引。
e,避免使用自查询,可以把自查询优化为join操作。
因为自查询是结果集,无法使用索引。另外自查询会产生临时表操作,如果查询量大则会严重影响效率。
f,避免使用join关联太多表。大查询拆成小查询,利用程序来做关联和合并。可以适当的进行表数据的冗余设计。
g,禁止用order by rand(),同样使用程序来完成。
h,where中不要对列进行函数计数,因为无法使用索引
i,UNION ALL 和UNION,如果数据明显不重复,就使用UNION ALL,UNION会增加一次去重复操作。
4,数据库操作行为方面:
a,对大表结构对操作会导致锁表,使用pt-online-schema-change(PERCONA)
原理:创建新表结构->复制旧表数据到新表->在原表上加入触发器确保数据同步->所有操作进行完毕后对原表进入一个很短暂的时间锁 ->把原表名修改,再更新新表名->删除原表
b,数据库出现问题后很多时候无需重启数据库,重启也不能解决实际问题,还是留有隐患。此时需要查找正在执行的语句id,kill掉,即可起死回生,再分析该语句产生问题的原因,解决问题。
mysql> show processlist;
mysql> kill pid;