加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

2019年PHP最新面试题(含答案)

发布时间:2020-12-25 02:27:49 所属栏目:运营 来源:网络整理
导读:1. 数据库设计经验,为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?什么是数据库垂直拆分?水平拆分?分区等等 一:为什么要分表 当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了
副标题[/!--empirenews.page--]

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 个。

<> 用 < 、> 代替,> 用 >= 代替,< 用 <= 代替,这样可以有效的利用索引。

在查询时尽量减少对多余数据的读取包括多余的列与多余的行。

对于复合索引要注意,例如在建立复合索引时列的顺序是 F1,F2,F3,则在 where 或 order?by 子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是 F1 或 F1,F2 或 F1,F2,F3。否则不会用到该索引。

多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下

select sum(table1.je)?from?table1 table1,table2 table2,table3 table3?where?(table1的等值条件(=))?and(table1的非等值条件)?and?(table2与table1的关联条件)?and?(table2的等值条件)?and?(table2的非等值条件)?and(table3与table2的关联条件)?and?(table3的等值条件)?and?(table3的非等值条件)。

注:关于多表查询时 from?后面表的出现顺序对效率的影响还有待研究。

子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询

在 WHERE?子句中,避免对列的四则运算,特别是 where?条件的左边,严禁使用运算与函数对列进行处理。比如有些地方?substring?可以用 like 代替。

如果在语句中有 not?in(in)操作,应考虑用 not?exists(exists)来重写,最好的办法是使用外连接实现。

对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读操作在前面完成,数据库写操作在后面完成,避免交叉。

请小心不要对过多的列使用列函数和 order?by,group?by 等,谨慎使用 disti 软件开发 t。

用 union?all?代替?union,数据库执行 union 操作,首先先分别执行 union 两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。

当已知的业务逻辑决定 query A 和 query B 中不会有重复记录时,应该用 union?all 代替 union,以提高查询效率。

20、选取最适用的字段属性 ,MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。

例如,在定义邮政编码这个字段时,如果将其设置为 CHAR (255),显然给数据库增加了不必要的空间,甚至使用 VARCHAR 这种类型也是多余的,因为 CHAR (6) 就可以很好的完成任务了。同样的,如果可以的话,我们应该使用 MEDIUMINT 而不是 BIGIN 来定义整型字段。

另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为 NOTNULL,这样在将来执行查询的时候,数据库不用去比较 NULL 值。

对于某些文本字段,例如 “省份” 或者 “性别”,我们可以将它们定义为 ENUM 类型。因为在 MySQL 中,ENUM 类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。

3. web 开发方面会遇到哪些缓存?分别如何优化?

浏览器缓存

在任何现代浏览器上 (如 IE,FireFox,Chrome) 折腾清除隐私数据的对话框,你很可能会注意到 “缓存” 这个设置项。

代理服务器缓存

Web 代理服务器使用同样的缓存原理,只是规模更大。代理以同样的方式服务千万用户,大公司和 ISP 经常在他们的防火墙或者单独的设备(也被称为中介 (intermediaries))上架设代理缓存。

网关缓存

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读