# 一个大佬的面试的面试问题
## 日常使用哪些数据库,有哪几种,区别和联系是什么
1. 关系型数据库
* 特点:数据集中控制;减少数据冗余
* 适用范围:更适用于结构化数据的处理,如学生成绩、地址等
2. 非关系型数据库
* 特点:易于扩展;数据量大;性能高;数据模型灵活
* 使用范围:根据模型比较简单,需要更灵活的IT系统,要求数据库性能高
## 索引有哪些类型
### 索引方法
* `FULLTEXT`
> 即为全文索引,目前只有`MyISAM`引擎支持。其可以在`CREATE TABLE ,ALTER TABLE ,CREATE INDEX` 使用,不过目前只有 `CHAR、VARCHAR ,TEXT` 列上可以创建全文索引。
>
> 全文索引并不是和`MyISAM`一起诞生的,它的出现是为了解决`WHERE name LIKE “%word%"`这类针对文本的模糊查询效率较低的问题
* `HASH`
> 由于`HASH`的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
>
> `HASH`索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在`“=”和“in”`条件下高效,对于范围查询、排序及组合索引仍然效率不高。
* `BTREE`
> `BTREE`索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口`root`开始,依次遍历`node`,获取`leaf`。这是**MySQL里默认和最常用的索引类型。**
* `RTREE`
> `RTREE`在`MySQL`很少使用,仅支持`geometry`数据类型,支持该类型的存储引擎只有`MyISAM、BDb、InnoDb、NDb、Archive`几种。
>
> 相对于`BTREE`,`RTREE`的优势在于范围查找。
### 索引类型
* 普通索引:仅加速查询
* 唯一索引:加速查询 + 列值唯一(可以有`null`)
* 主键索引:加速查询 + 列值唯一(不可以为`null`) + 表中只有一个
* 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
* 全文索引:对文本内容进行分词,进行搜索
> 索引合并:使用多个单列索引组合搜索
>
> 覆盖索引:`select`的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
## 页面访问量大,导致加载慢,应该怎么优化
* 减少`HTTP`请求
* 使用`CDN`
* 压缩组件
* 将样式表放在头部
* 将脚本放在底部
* 避免`css`表达式
* 使用外部的`js`和`css`
* 减少`DNS`查找
* 精简`JavaScript`
* 避免重定向
* 删除重复脚本
* 使`Ajax`可缓存
## session,cookie区别与联系
区别:
* `session`存储在服务端,存储用户访问的全局唯一变量
* `cookie`存储在客户端,存储连续访问一个页面时所用
两者都可以通过时间来设置长短
## 讲述一下正则表达式
## redis的数据类型有哪些,分别怎么定义
1. 数据类型
* `string`:基本的类型,`set/get`,做简单的`kv`缓存
* `hash`:类似`map`的一种结构,一般可以将结构化数据给缓存在`redis`里,然后每次读写缓存的时候,可以就操作`hash`里的某个字段
~~~
key = 150
value = {
"id”: 150,
“name”: “zhangsan”,
“age”: 20
}
~~~
`hash`类的数据结构,主要是用来存放一些对象,把一些简单的对象给缓存起来,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。
* `list`:有序列表,案例:微博,某个大V的粉丝,就可以用`list`的格式放在`redis`里去缓存
~~~
key = 某大V
value = [张三, 李四, 王五]
~~~
比如可以通过`list`存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。
* `set`:无序集合,自动去重
案例:可以基于set玩儿交集、并集、差集的操作,比如交集吧,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁?对吧
把两个大v的粉丝都放在两个set中,对两个set做交集
* `sorted set`:排序的`set`,去重但是可以排序,写进去的时候给个分数,自动根据分数排序
## 为什么要设计单例模式
> 从面相对象的角度讲:
>
> 虽然都能实现目的,但是他们一个是基于对象,一个是面向对象的,就像我们不面相对象也能解决问题一样,面相对象的代码提供一个更好的编程思想。
>
> 如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,反之他就应该是非静态的。如果我们确实应该使用非静态的方法,但是在创建类时又确实只需要维护一份实例时,就需要用单例模式了。
>
> 从功能上讲:单例模式可以控制单例数量;可以进行有意义的派生;对实例的创建有更自由的控制;
## 设计模式你知道哪些?(单例,工厂)
## 浏览器请求一个页面的经过步骤
1. 利用`DNS`协议进行域名解析
2. 建立`TCP`协议三次握手过程
3. 客户端发出访问网站相应页面的请求,即发出`HTTP`协议请求报文
4. 服务端发出相应访问页面的请求信息
5. 断开`TCP`协议四次挥手过程
## 讲述一下`swoole`异步,协程,多线程
## ajax原理
> **Ajax的原理简单来说通过`XmlHttpRequest`对象来向服务器发送异步请求,从服务器获得数据,然后用`javascript`来操作DOM而更新页面。**这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 `XMLHttpRequest`有所了解。
## `mvc`设计模式的原理和优缺点
## 面向对象的原理
## 数据库的三范式
## 阿帕奇和nginx优缺点
- PHP获取客户端浏览器信息和版本
- PHP获取客户端操作系统信息
- 无限级分类
- git使用
- 权限检测思路
- Vue学习
- 遇到的一些问题
- PHP的编码思维和技巧
- mysql复习
- tp5
- ThinkPHP5.x 公共函数
- TP5登录注册
- TP5使用模板继承
- ThinkPHP5.1 清除缓存
- thinkphp5实现安装程序
- 安全
- tp中实现跨域代码
- ThinkPHP5.1配合pjax实现菜单栏无刷新跳转
- 获取数据库版本和数据库大小
- 模型的基本CURD操作
- 商品spu
- 全局异常处理类
- ExceptionHandler
- BaseException
- PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
- 微信小程序
- wx:for
- tp6
- 分离的一些模块
- session开启
- Spring
- 依赖注入
- 数据结构
- 二叉树
- js获取地址栏变量
- PHP设计模式
- 面向对象
- PHP1
- PHP性能优化
- Java学习
- static关键字
- 多态
- 接口、阶乘
- 大佬给的面试题
- 访问量为5000万的博客系统设计
- PHP可变参数
- Nginx的配置案例
- 求数组中的最大值,并返回数组索引
- PHP面试方向
- PHP数组工具类ArrUtil
- 字符串工具类StrUtil
- PHP使用curl发送请求
- mysql
- PHP上传base64图片处理函数
- webstorm小程序常用配置
- 邮箱正则表达式
- leetcode mysql记录
- 函数库