如下是結合網上及此前面試時遇到的一些關於mysql索引的面試題。
若對mysql索引不太瞭解可先翻閱相關文章mysql
索引相似書本的目錄,查詢書中的指定內容時,先在目錄上查找,以後可快速定位到內容位置。在數據庫中一般經過B樹/B+樹數據結構實現。sql
主鍵索引樹中葉子節點存儲的是整行數據,而非主鍵索引葉子節點上保存的是主鍵的值。使用非主鍵索引時,先從非主鍵索引獲取到行對應主鍵ID,以後再根據id在主鍵索引樹上搜索對應行數據,這個過程也被稱爲回表。數據庫
通常使用innodb的自增整數類型做爲主鍵:數組
爲查詢條件字段建立索引,以達到快速過濾指定條件數據的目的。數據結構
## order by
當使用order by將查詢結果按某個字段排序時,可考慮爲該字段建立索引。沒有索引時,會先將查詢結果放到內存中進行排序(若內存空間不足,會利用磁盤輔助排序),比較影響查詢效率。
索引自己是有序的,能夠直接按索引的順序逐條回表取出數據便可。若是是分頁查詢,效果更好,這時候只須要取出某個範圍的索引對應的數據,而不須要取出全部知足條件的數據排序後再截取返回分頁數據。函數
使用join時,爲被驅動表的關聯字段建立索引,能夠有效提升查詢效率。好比select * from t1 straight_join t2 on (t1.a=t2.a) where t1.b = 'xxxx';
t2的字段a上有索引,查詢過程會是先從表1中依次取出知足條件的行數據,以後用行數據中的a字段去t2上匹配後將兩表字段拼接返回,此時能使用到t2.a的索引,避免了t2全表掃描。性能
若是select字段+where字段字段列數不太多且查詢頻繁時,能夠考慮爲select和where字段建立聯合索引,避免查詢時回表,提升查詢效率。好比select a from t where b = ‘xx’
, 建立聯合索引(b, a), 此時掃描索引樹後,就已經獲得須要查詢的字段a了,不須要再回表。須要注意的是聯合索引字段的順序,這個語句沒法使用到索引(a, b)。mysql索引
a = 1 and b = 2 and c > 3 and d = 4
,若是創建 (a,b,c,d) 順序的索引,d 是用不到索引的。order by a,b,c,d
。上面查詢條件中,a定值,b是有序的;b定值,c是有序的;c範圍查詢,剩下的d是無序的。因此d沒法使用到該索引。a=1 or b = 2
,只有當a和b都有索引才能使用到索引。Mysql設計的使用場景比較普遍,須要對遍歷查詢、單條查詢、數據更新都須要較好的性能支持。B+樹的特性是隻在葉子節點上存儲數據。能夠從數據讀寫方面與哈希表、有序數組、b樹其餘幾種索引模型進行比較:學習
能夠考慮先刪掉表的索引,等刪除數據後再重建索引。當咱們在進行數據修改時,須要同時修改索引,這些額外的索引維護成本較低數據修改的效率;同時,大量的數據刪除會致使索引數據頁產生大量的碎片空間,此時刪除數據後重建索引可使索引樹更「緊湊」,提升磁盤空間利用率。
數據頁調整後,若是數據頁過小層數會太深,數據頁太大,加載到內存的時間和單個數據頁查詢時間會提升,須要達到平衡才行。
能夠利用 explain 查看 sql 語句的執行計劃,經過執行計劃來分析索引使用狀況。
喜歡本文的朋友,歡迎關注公衆號「會玩 code」,專一大白話分享實用技術。
回覆【mysql】獲取免費測試數據庫!!
回覆【pdf】獲取持續更新海量學習資料!!