23 September 2014

数据库设计方面

  • 适度的反范式

第三范式是肯定需要遵守的,尤其是OLTP型数据库。 但是第三范式也有缺点:查询时经常需要大量的Join,导致查询效率不高。 所以有时候为了性能的考虑,适度的违反第三范式,做适当的冗余设计。

OLTP,联机事务处理,可以理解为关系型数据库。
OLAP,联机分析处理,可以理解为数据仓库。
  • 适当建立索引

索引的字段必须是经常作为查询条件的字段,因为查询速度的提高是以更新、创建、删除的性能为代价的。

索引字段要有足够的区分度。

联合索引的第一项必须要有,第二项才能生效。

支持前缀索引。

关于索引方面的知识有很多,这里就先不展开了。

  • 对表进行水平切分

好的水平切分,有利于程序的实现,也能充分利用到水平分表的优势。

比如数据条数很多,上千万级别,而且系统界面中只提供按月份进行查询,那么就可以考虑将大表水平拆分为12个表。

  • 对表进行垂直切分

如果表的字段非常多,会占用大量的空间,检索表时需要执行大量I/O,影响性能。这时可以把一些字段切分到另一个表,新表和旧表是一对一映射。如果有些字段不常用又很长,那更应该拆分出去。

  • 选择适当的字段类型

主键用自增,timestamp只用4字节而datetime用8字节

文件、图片存储在文件系统中,数据库中只保存路径。

外键要表示清楚,这样可以方便建立索引。

  • 选择合适的存储引擎

innodb、myisam、memory等。

关于innodb会在另外文章里详细说明。

SQL语句优化

要善于利用工具:慢查询日志slow query log

slow_query_log = xxx.txt
long_query_time=2

这就可以记录执行超过2秒的语句。

知道是哪些语句慢了之后,可以通过explain来分析执行计划。

  • 用集中批量操作代替频繁读写

这样可以减少IO。

数据库参数配置

最主要的参数是调整内存。 可以用show status看状态,然后确定内存大小。

合理的硬件资源和操作系统

如果内存超过4G,要使用64位OS和64位MySQL。

  • 读写分离

master-slave架构,从多台slave读数据,向一台master写入数据。

业界有amobe可以作为数据库中间件。

-EOF-