# 一個大佬的面試的面試問題
## 日常使用哪些數據庫,有哪幾種,區別和聯系是什么
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記錄
- 函數庫