索引模塊
爲什麼要使用索引?
一、快速查詢數據。有了索引可以避免全表掃描,提高查詢效率
什麼樣的信息能成爲索引?
一、主鍵、唯一鍵以及普通鍵等
索引的數據結構
一、生成索引,建立二叉查找樹進行二分查找
二、生成索引,建立B-Tree 結構進行查找
三、生成索引,建立B+-Tree 結構進行查找 (主流!!!)
四、生成索引,建立Hash 結構進行查找。
BetMap等
MySql數據庫不支持BetMap 索引
密集索引和稀疏索引的區別?
密集索引文件中的每個搜索碼值都對應一個索引值
稀疏索引文件只爲索引碼的某些值建立索引項
額外補充:
Inno DB
若一個主鍵被定義,該主鍵則作爲密集索引
若沒有主鍵被定義,則該表的第一個唯一非空索引則作爲密集索引
若不滿足以上條件,Inno DB內部會生成一個隱藏的主鍵(密集索引)
非主鍵索引存儲相關鍵位和其對應的主鍵值,包含兩次查找
衍生出來的問題,以MySQL爲例
如何定位並優化慢查詢SQL?
一、根據慢日誌定位慢查詢SQL(以下不是永久生效,永久去配置文件設置)
show variables like '%quer%';
其中
slow_query_log OFF關閉 需要打開 打開方式 set global show_query_log = on;
slow_query_log_file 日誌文件的路徑
long_query_time 是指如果這個SQL執行超過十秒鐘就會被記錄到日誌文件中去,也就是慢日誌。set global long_query_time = 1;
show status like '%slow_queries%';
slow_queries 即慢查詢的數量
二、使用explain 工具去分析SQL
用法是 explain 關鍵字 加在SQL的最前面。
all 代表全表掃描
all index 代表需要優化
三、修改SQL或者讓SQL儘量走索引
force index () 強制走索引
聯合索引的最左匹配原則的成因?
索引是建的越多越好嗎?
數據量少的表不需要建立索引,建立會造成額外的索引開銷。
數據變更需要去維護索引,所以意味着更多的索引更多的維護成本。
意味着更多的索引需要更多的空間。