索引的分類
建議 一張表最多建索引不要超過5個。
分組之前必排序
單值索引
一個索引只包含單個列,一個表可以有多個單列索引。
建議 一張表最多建索引不要超過5個
排序儘量遵守所建索引的順序和個數。
group by 儘量遵守所建索引的順序和個數。
唯一索引
索引列的值必須唯一,但允許有空值。
複合索引
即一個索引包含多個列。
索引的基本語法
創建索引
create [unique] index idnexName on tableName(columnname(length));
alter table tableName add [unique] index [indexName] on (columnname(length));
刪除索引
drop index [indexName] on tableName;
alter table tableName drop index indexName;
查看索引
show index from tableName;
例子:
mysql索引結構
- BTree索引
查找過程
如果要查找數據項29,那麼首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,29在17-35之間,鎖定磁盤塊1的p2指針,內存時間(相比磁盤的IO)忽略不計,通過指針p2找到磁盤塊3,發生第二次IO,29在23-34之間,鎖定磁盤塊3的p2指針,通過指針加載磁盤塊8,通過對比發現磁盤塊8的數據項29即爲查找項,結束查詢,共計三次IO。
-
Hash索引
-
Full-text全文索引
-
R-Tree索引
需要創建索引的情況
- 主鍵自動建立唯一索引
- 頻繁作爲查詢條件的字段應該創建索引
- 頻繁更新的字段不適合創建索引
- where條件裏用不到的字段不創建索引
- 在高併發場景下傾向創建複合索引
- 查詢中排序的字段,排序字段若通過索引去訪問將大大提高怕羞的速度
- 查詢中統計或者分組字段
不需要創建索引的情況
-
表記錄太少
因爲索引也是以文件的方式在磁盤存放
-
經常增刪改的表
可能會經常出現索引失效的情景
-
數據重複且分佈平均的字段
即列的離散性越大越適合創建索引,count(distinct column) / count(*) 該值越大說明該列重複數據越少,越適合創建索引