php算法数据结构面试 php算法面试题及答案( 四 )


二、数据库设计经验 , 为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?
1、为什么要分表
当一张表的数据达到几百万时 , 你查询一次所花的时间会变多 , 如果有联合查询的话,有可能会死在那儿了 。分表的目的就在于此,减小数据库的负担,缩短查询时间 。日常开发中我们经常会遇到大表的情况 , 所谓的大表是指存储了百万级乃至千万级条记录的表 。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长 , 性能低下 , 如果涉及联合查询的情况 , 性能会更加糟糕 。
分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率 。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大 , 相应地,数据操作 , 增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈 。
2、分表的方案
做 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表 , 但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担 , 说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个 , 这样等待时间是不是大大的缩短了呢?
linux mysql proxy 的安装,配置 , 以及读写分离
mysql replication 互为主从的安装及配置,以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php 代码)
缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大 。
三、简述一下数据库主从复制,读写分离
* 什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;
* 主从复制的原理:
1.数据库有个bin-log二进制文件,记录了所有的sql语句 。
2.只需要把主数据库的bin-log文件中的sql语句复制 。
3.让其从数据的relay-log重做日志文件中再执行一次这些sql语句即可 。
* 主从复制的作用
1.做数据的热备份,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失 。
2.架构的扩展 。业务量越来越大,I/O访问频率过高 , 单机无法满足,此时做多库的存储,降低磁盘I/O访问频率,提高单机的I/O性能
3.主从复制是读写分离的基?。故菘饽苤瞥筛?的并发 。例如子报表中,由于部署报表的sql语句十分慢,导致锁表,影响前台的服务 。如果前台服务使用master , 报表使用slave,那么报表sql将不会造成前台所,保证了前台的访问速度 。
* 主从复制的几种方式:
1.同步复制:所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回 。
2.异步复制:如同AJAX请求一样 。master只需要完成自己的数据库操作即可 。至于slaves是否收到二进制日志,是否完成操作,不用关心 。MYSQL的默认设置 。
3.半同步复制:master只保证slaves中的一个操作成功,就返回,其他slave不管 。

推荐阅读