1. 数据库设计经验,为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?什么是数据库垂直拆分?水平拆分?分区等等
一:为什么要分表
当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
二:分表的方案
1,做 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是不是大大的缩短了呢?
linux mysql proxy 的安装,配置,以及读写分离
mysql replication 互为主从的安装及配置,以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php 代码)
缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。
2. 垂直分割就是按字段分。水平分割。就是按记录分
2. 数据库优化有哪些?分别需要注意什么?
SQL 优化的原则是:将一次操作需要读取的 BLOCK 数减到最低,即在最短的时间达到最大的数据吞吐量。
调整不良 SQL 通常可以从以下几点切入:
检查不良的 SQL,考虑其写法是否还有可优化内容
检查子查询 考虑 SQL 子查询是否可以用简单连接的方式进行重新书写
检查优化索引的使用
考虑数据库的优化器
避免出现 SELECT * FROM table 语句,要明确查出的字段。
在一个 SQL 语句中,如果一个 where 条件过滤的数据库记录越多,定位越准确,则该 where 条件越应该前移。
查询时尽可能使用索引覆盖。即对 SELECT 的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
在判断有无符合条件的记录时建议不要用 SELECT COUNT ()和 select top 1 语句。
使用内层限定原则,在拼写 SQL 语句时,将查询条件分解、分类,并尽量在 SQL 语句的最里层进行限定,以减少数据的处理量。
应绝对避免在 order by 子句中使用表达式。
如果需要从关联表读数据,关联的表一般不要超过 7 个。
小心使用 IN 和 OR,需要注意 In 集合中的数据量。建议集合中的数据不超过 200 个。
<> 用 < 、> 代替,&g