在使用数据库时,当数据的访问量过大的时候,就要对数据库进行优化。一般可以在以下几个方面进行考虑。(以mysql为例)
1.首先选择合适的DBMS,根据业务情况选择合适的数据库,例如mysql,sql server, Oracel等
2.建表的时候优化,使用合适的数据类型,尽量使用占用内存空间小的,对字段都加NOT NULL约束,对表添加冗余字段,反范式化等
3.SQL语句优化,对查询的SQL语句进行优化,尽量使用索引,避免索引失效。尽量别使用子查询(会建立并销毁临时表,消耗资源),别使用join语句(当数据量大的时候导致性能问题)。查询数据尽量别用select *,尽量使用带范围的查询.
4.索引优化,对经常连在一起查询的字段使用联合索引,经常查询的字段使用索引等等,索引建立的数量也不宜过多,因为mysql维护索引需要花费一定的代价,在时间 上和空间上都会有代价
5.使用Redis或Memory等中间件作为缓存。因为myslq中自带的缓存buffer_pool的容量大小有一定的限制。可以将经常使用到的数据放在中间件缓存中,等用户下次查询相同数据不用再访问数据库,直接访问中间件中的数据就可,减少了IO操作,查询数据效率大大提升。
6.搭建集群,搭建mysql集群,设置一主多从或者多主多从。读写分离读数据和写数据不在同一个mysql服务器上面,降低了单个mysql服务器的压力
7.分库分表,当表的数据量过大的时候可以考虑分库分表。根据业务将数据库做一个拆分。分表时可以根据属性(如时间、类型等)对表进行水平拆分,或者根据冷热数据对表进行垂直拆分
当然,以上对数据库的优化也不一定都是对的,具体的实现还是要根据具体的业务来决定。优化的方式都是有利也有弊。比如添加索引,数据的查询效率是变高了,但是维护索引的成本也增加了,使用redis作为缓存,能降低mysql服务器的压力,但是会产生数据一致性的问题。搭建集群需要成本,分库分表可能会产生冗余,分布式问题等。