程序员面试必备PHP中高级面试题 – 第三天

“PHP学习网” 公众号会天天分享一些面试题,正在找工做的小伙伴们能够来看看哦。

1、简述一下MongoDB的应用场景

mongodb 支持副本集、索引、自动分片,能够保证较高的性能和可用性。php

更高的写入负载mysql

默认状况下,MongoDB 更侧重高数据写入性能,而非事务安全,MongoDB 很适合业务系统中有大量 “低价值” 数据的场景。可是应当避免在高事务安全性的系统中使用 MongoDB,除非能从架构设计上保证事务安全。linux

高可用性面试

MongoDB 的复副集 (Master-Slave) 配置很是简洁方便,此外,MongoDB 能够快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得 MongoDB 能在一个相对不稳定(如云主机)的环境中,保持高可用性。redis

数据量很大或者将来会变得很大sql

依赖数据库 (MySQL) 自身的特性,完成数据的扩展是较困难的事,在 MySQL 中,当一个单达表到 5-10GB 时会出现明显的性能降级,此时须要经过数据的水平和垂直拆分、库的拆分完成扩展,使用 MySQL 一般须要借助驱动层或代理层完成这类需求。而 MongoDB 内建了多种数据分片的特性,能够很好的适应大数据量的需求。mongodb

基于位置的数据查询数据库

MongoDB 支持二维空间索引,所以能够快速及精确的从指定位置获取数据。安全

表结构不明确服务器

在一些传统 RDBMS 中,增长一个字段会锁住整个数据库 / 表,或者在执行一个重负载的请求时会明显形成其它请求的性能降级。一般发生在数据表大于 1G 的时候(当大于 1TB 时更甚)。 因 MongoDB 是文档型数据库,为非结构货的文档增长一个新字段是很快速的操做,而且不会影响到已有数据。另一个好处当业务数据发生变化时,是将不在须要由 DBA 修改表结构。

2、数据库设计经验,为何进行分表?分库?通常多少数据量开始分表?分库?分库分表的目的?

  • 一、为何要分表

当一张表的数据达到几百万时,你查询一次所花的时间会变多,若是有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减少数据库的负担,缩短查询时间。平常开发中咱们常常会遇到大表的状况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,致使数据库在查询和插入的时候耗时太长,性能低下,若是涉及联合查询的状况,性能会更加糟糕。分表和表分区的目的就是减小数据库的负担,提升数据库的效率,一般点来说就是提升表的增删改查效率。数据库中的数据量不必定是可控的,在未进行分库分表的状况下,随着时间和业务的发展,库中的表会愈来愈多,表中的数据量也会愈来愈大,相应地,数据操做,增删改查的开销也会愈来愈大;另外,因为没法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

  • 二、分表的方案

作 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表,可是它启到了分表的做用,作集群的意义是什么呢?为一个数据库减轻负担,说白了就是减小 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,若是放在一个数据库服务器的排队队列中,他要等很长时间,若是把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是否是大大的缩短了呢?

linux mysql proxy 的安装,配置,以及读写分离

mysql replication 互为主从的安装及配置,以及数据同步

优势:扩展性好,没有多个分表后的复杂操做(php 代码)

缺点:单个表的数据量仍是没有变,一次操做所花的时间仍是那么多,硬件开销大。

3、简述一下数据库主从复制,读写分离

  • 什么是主从复制

主从复制,是用来创建一个和主数据库彻底同样的数据库环境,称为从数据库;

  • 主从复制的原理:

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无论。
这个功能,是由google为MYSQL引入的。

  • 关于读写分离

在完成主从复制时,因为slave是须要同步master的。因此对于insert/delete/update这些更新数据库的操做,应该在master中完成。而select的查询操做,则落下到slave中。

最后各位能够扫下方二维码关注我公众号,目前我正在更新基础面试题,以后会更新中高级、redis、liunx面试题

weixin.jpg

相关文章
相关标签/搜索