數據庫存儲引擎--常見的數據庫存儲引擎有MyIsAM和InnoDB,相比於MyIsAM存儲引擎,InnoDB存儲引擎它支持事務和行級鎖,所以InnoDB也是目前市場上的主流存儲引擎;
以下概念都是基於InnoDB存儲引擎:
索引類型:
普通索引--葉子節點存儲的是主鍵值;
聚集索引--葉子節點存儲的是行記錄;
聚集索引的特點:InnoDB有且只有一個聚集索引;如果定義了PK,則PK字段就是聚集索引;如果未定義PK,則第一個not NULL unique列就是聚集索引;否則,InnoDB會創建一個隱藏的row-id作為聚集索引;
回表查詢:
數據庫先定位到主鍵值,再根據主鍵值定位到行記錄,總共需要掃描兩邊樹,SQL_Server官網和MYSQL官網文檔指出說掃描一遍索引樹就可以獲取到所需的列數據是效率最高,所以我們應該避免回表查詢;
索引覆蓋:
被查詢的字段,是建立在聯合索引里去,效率高;
舉個栗子:先創建單列索引 index( id PK,name )
select id, name from table ;這個SQL會根據索引 name 定位到主鍵值 id ,再定位到行記錄,這就是覆蓋索引;
我們可以通過 Explain 關鍵字查看SQL執行計划,其中 extra 列看這個SQL執行過程是否觸發索引覆蓋,如果有索引覆蓋那么 extra 列結果是“Using index”;
select id, name, sex from table ;這個SQL中的 sex 字段必須通過回表查詢才可以拿到行記錄,所以效率會較低,如果要覆蓋索引,可以將單列索引升級為聯合索引,即 index( id PK, name, sex ),這樣就成功避免
了回表查詢,從而提高了查詢效率;