# 一个大佬的面试的面试问题 ## 日常使用哪些数据库,有哪几种,区别和联系是什么 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优缺点