MySQL主要有兩種結構:
Hash索引
B+ Tree索引(InnoDB引擎)
B+ Tree索引和Hash索引區別?
哈希索引適合等值查詢,但是無法進行範圍查詢
哈希索引沒辦法利用索引完成排序
哈希索引不支持多列聯合索引的最左匹配規則
如果有大量重複鍵值的情況下,哈希索引的效率會很低,因爲存在哈希碰撞問題
覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就能夠取得,不必從數據表中讀取。也可以稱之爲實現了索引覆蓋。
當一條查詢語句符合覆蓋索引條件時,MySQL只需要通過索引就可以返回查詢所需要的數據,這樣避免了查到索引後再返回表操作,減少I/O提高效率。
索引失效:
沒有遵循最左匹配原則(組合索引的第一個字段必須出現在查詢語句中)
or、!=、not in、is [not] null
like '%……'
隱式轉換
索引字段應用內部函數或運算
三範式:
原子性:數據列不可再分
每一行數據具有唯一性,並消除數據之間的"部分依賴"(聯合主鍵)
獨立性、消除傳遞依賴
數據庫優化:
優化sql
創建索引
分表:水平分表(數據比較多)、垂直分表(字段值比較少使用)
讀寫分離
緩存:使用redis作爲中央緩存,在持久層(dao)和數據庫之間添加一個緩存層
慢查詢定位:
set GLOBAL slow_query_log = ON;
set GLOBAL slow_query_time = 1;
explain 需要執行的sql;