PHP面试总结

数据库构建有什么经验?

1.标准的对象命名规范
2.设计数据库的时候满足3大范式

  • 第一范式(1NF):原子性,数据不可再分:一个表中的数据(字段值)不可再分
  • 唯一性,消除部分依赖:一个表中的每一行必须唯一可区分,且非主键字段值完全依赖主键字段值。
  • 独立性,消除传递依赖,使一个表中的任何一个非主键,完全独立地依赖于主键,而不能又依赖于另外的非主键。
    尽可能的减少数据冗余

3 .将经常需要操作的数据和不经常操作的数据分开
4.仔细的选择数据类型。
char 自动补齐后面空格,最大255个字符
varchar可变字符串 最大65532个字节 取决于最大行存储量 另外需要1-2字节长度标识(每个变长字段额外使用1或者2个字节记录实际数据长度),NULL标识位(是否为NULL);
5.创建适当的索引

  • 避免非必要索引,因为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
  • 索引所用到的数据结构,B树及其B+树,运用二叉查找在O(log2n)的复杂度内获取到相应数据。
  • 经常使用索引的列: 经常搜索的列上,加快搜索速度 。 主键列上,强制该列唯一性和数据的排列结构。 外键上加快连接。经常排序的列上,和where子句中的列上。
  • 聚集索引

    6.OPTIMIZE TABLE

MVC的优点

低耦合性
高重用性和可适用性
可维护性好
较低的生命周期成本
快速的部署
有利于软件工程化管理

当然优点也有缺点,那就是内部结构复杂,不容易理解,文件数量大,管理难度自然也就大

三层架构和MVC区别

三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层)。
三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑。

MVC是在应用程序(BS结构)的视图层划分出来的不同功能的几个模块。
MVC主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。

MyISAM和InnoDB的区别

1.MySQL5.5版本之后默认采用的是Innodb引擎。

2.MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

3.InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

4.InnoDB支持外键,MyISAM不支持。

5.InnoDB的主键范围更大,最大是MyISAM的2倍。

6.InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

7.没有where的count()使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count()时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count()的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

值得注意的5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个
4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节)

Mysql char and varchar

VARCHAR与CHAR两种字符型数据类型相比,最大的差异就是前者是可变长度,而后者则是固定长度。在存储时,前者会根据实际存储的数据 来分配最终的存储空间。而后者则不管实际存储数据的长度,都是根据CHAR规定的长度来分配存储空间。虽然VARCHAR数据类型可以节省存储空间,提高数据处理的效率。但是其可变长度带来的一 些负面效应

可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符 型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。

对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来 说,则不是。其时使用固定大小的内存块来保存值,这对于排序或者临时表操作(这些内容都 需要通过内存来实现)作业会产生比较大的不利影响,采用varchar定义长度。
所以在使用长度基本相同,长度在255字节以内的建议使用char类型

ThinkPHP

自动验证:$_validate
前端模板:ThinkTemplate
自动备份:crontab 分 时 日 月 周 command

数据库优化

目的

  1. 数据库连接timeout产生5xx错误
  2. 慢查询造成页面无法加载
  3. 阻塞造成数据无法提交
    目的减少数据库低效查询

优化方向
这里写图片描述
mysql数据库是基于文件的

SQL及索引:结构良好的SQL以及有效的索引,如果索引过多会对数据插入以及读取是有影响的
数据库表结构:一个好的数据库表结构
系统配置:TCP/IP最大连接数,打开文件数的限制
硬件:内存方面,更快IO设备(SSD),但是并不能防止数据库锁的限制,减少阻塞,cpu方面需求不是很大

SQL及索引

慢查询日志

方式:mysqldumpslow
pt-query-digest

通过慢查询日志发现有问题的SQL?
1.查询次数多且每次查询占用时间长的SQL
pt-query-digest分析的前几个查询
2.
IO大的SQL,扫描行数多的
3.
为命中索引的SQL

分析SQL查询

使用explain查询SQL的执行计划
type 显示连接使用了何种类型 最好到最差为 const,eq_reg,ref,range(索引范围),index(索引扫描),all
extra : Using filesort 对返回的所有行进行额外排序
Using temporary 会创建一个临时表

sql语句优化:

max() 全表扫描 一定加索引
count(加or null)
将子查询优化成连接查询 但是要将distinct 对连接查询去重
group by 分组连接查询 先将连接再查询,不要查询后再连接
order by 全表扫描 一定要加索引
Limit 分页时 记录上次返回的行数,加上where判断语句,来减少扫描的行数

索引优化
在group by 从句 ,order by 从句,on,where中加索引
对表的数据全部加上索引叫做覆盖索引,一般在字段比较少的时候
索引字段越小越好 存储是按页存储,减少IO。
离散度大的放在联合索引的前面

不得不说增加索引会加快查询速度,但会减少写入速度
如果索引过多系统还需要去判断需要用哪一个索引
innodb会在每一个索引后都加上主键索引

pt-duplicate-key-checker工具检查重复及冗余索引
pt-index-usage 删除不用的索引

Memcache 和 Redis

共同点:都是将数据缓存在内存中
不同点:Redis有部分存在硬盘上,这样能保证数据的持久性
并当(物理内存用完时)可以将数据存向外存
Memcache 只支持key/value存储
Redis 还支持list ,set,hash等存储结构

Redis中通过set get del setex(设置过期时间操作) 默认端口号 6379
Memcache 默认端口号 11211

MongoDB

MongoDB基于文件的非关系型数据库,虽然被是一款非关系数据库,但其当很像关系数据库的。他支持的数据结构是类似于json的bson格式,可以存y储数据结构非常松散。查询语句很强大,还支持对数据建立索引。

PHP垃圾回收机制

我们的代码中用了unset,null,mysql_close,__destruct等等一些函数去释放对象防止内存溢出,

PHP自身使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个引用连接到对象,计数器加1。当引用离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

如何处理PHP高并发问题

  1. //高性能服务器,能够支持维度的访问量
  2. 构建分布式服务器,并且尽量的能够做到负载均衡
  3. 优化数据库访问,尽量使前台实现页面静态化。但经常更新的网站,将动态数据缓存到文件中,由服务器直接去访问文件,或者加一层Redis数据库或者memcached缓存,将数据缓存在内存中
  4. //如果要用到数据库访问的话,优化其SQL语句,增加索引命中率。利用存储过程缓存执行计划
  5. 禁止外部的盗链。 (外部盗链将会对服务器造成巨大压力)
  6. 控制文件的下载,文件的下载会对服务器消耗巨大的流量并且消耗CPU,控制文件大小,如果可能单独做一台文件传输服务器
  7. 消息队列(加在第二条后面)
  8. server。使用nginx+fpm或者nginx+apache,来实现动静态分离访问。(第三条里说)

简单的说就是
1. 让同时并发数量降下来
2. 让同时处理效率升上去
能静态化的静态化
不能静态化的用分布式算法

PHP函数
preg_match() 字符串正则匹配
date()
strtotime()将时间转为时间戳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值