## **索引的一些潛規則**
* **覆蓋索引**
>**通常開發人員會根據查詢的where條件來創建合適的索引,但是優秀的索引設計應該考慮到整個查詢。其實mysql可以使用索引來直接獲取列的數據。如果索引的葉子節點包含了要查詢的數據,那么就不用回表查詢了,也就是說這種索引包含(亦稱覆蓋)所有需要查詢的字段的值,我們稱這種索引為覆蓋索引。**
* **回表**
>**先通過普通索引的值定位聚簇索引值,再通過聚簇索引的值定位行記錄數據,需要掃描兩次索引B+樹,它的性能較掃一遍索引樹更低。**
* **最左前綴原則**
>**最左前綴原則是指當建立了聯合索引如(a,b,c)時,可以根據a/(a AND b)/(a AND b AND c)三種條件使索引進行檢索,一般需要將最頻繁使用的列放到最左邊。當使用`=`或`in`時可以亂序a、b、c三個條件,MySQL會自動優化索引可識別的形式。另外,當遇到范圍查詢(LIKE、BETWEEN、>、<)則會停止匹配。**
~~~text
SELECT * FROM user WHERE a=1 AND b=1 AND c>1 AND d=1
~~~
>**上面的SQL語句建立了(a,b,c,d)的索引,只能匹配到(a AND b),遇到`d>1`直接停止使用索引匹配,不過如果建立(a,b,d,c)的索引就可以匹配到d。**
* **索引下推**
> **索引下推(index condition pushdown )簡稱ICP,在Mysql5.6的版本上推出,用于優化查詢。
在不使用ICP的情況下,在使用非主鍵索引(又叫普通索引或者二級索引)進行查詢時,存儲引擎通過索引檢索到數據,然后返回給MySQL服務器,服務器然后判斷數據是否符合條件 。
在使用ICP的情況下,如果存在某些被索引的列的判斷條件時,MySQL服務器將這一部分判斷條件傳遞給存儲引擎,然后由存儲引擎通過判斷索引是否符合MySQL服務器傳遞的條件,只有當索引符合條件時才會將數據檢索出來返回給MySQL服務器 。
索引條件下推優化可以減少存儲引擎查詢基礎表的次數,也可以減少MySQL服務器從存儲引擎接收數據的次數。**
- PHP篇
- 函數傳值和傳引用的區別
- 簡述PHP的垃圾回收機制
- 簡述CGI、FAST-CGI、PHP-FPM的關系
- 常見正則表達式
- 多進程寫文件,如何保證都寫成功
- php支持回調函數的數組函數
- MySQL篇
- MySQL的兩種存儲引擎區別
- 事務的四大特性
- 數據庫事務隔離級別
- 什么是索引
- 索引有哪些數據結構,優缺點
- 索引的一些潛規則
- SQL的優化方案
- 簡述MySQL的鎖機制
- 死鎖是怎么產生的?怎么解決?
- 簡述MySQL的主從復制過程,延遲問題怎么解決
- 分布式事務的解決方案
- 數據庫中間件MyCat
- Linux篇
- Linux常用命令
- 對日志文件的IP出現的次數進行統計,并顯示次數最多的前5名
- WEB篇
- 跨域是怎么產生的,如何解決跨域
- Redis篇
- redis介紹
- redis和memcached區別
- redis的持久化方案
- 緩存穿透、擊穿、雪崩、預熱、更新、降級
- 網絡篇
- 計算機網絡體系結構
- 簡述TCP的三次握手、四次揮手過程
- UDP、TCP 區別,適用場景
- HTTP常見狀態碼含義
- 設計模式篇
- 單例模式
- 簡單工廠模式
- 抽象工廠模式
- 觀察者模式
- 策略模式
- 注冊模式
- 適配器模式
- 安全篇
- 跨站腳本攻擊(XSS)
- 跨站點請求偽造(CSRF)
- SQL 注入
- 應用層拒絕服務攻擊
- PHP安全
- 運維篇
- docker面試題
- 消息隊列篇
- 架構篇
- 數據結構與算法篇