索引的概念 不使用索引,要操作某些行時,需要遍歷遍歷整張表來找到匹配的行,很花時間,且有點耗資源。 書:目錄=>快速定位到指定章節,不用一頁一頁地找 資料庫:索引=>快速定位到指定記錄,不用遍曆數據表去找,索引相當於數據表的目錄 索引的優缺點 提高查詢效率,尤其是記錄數超級多的時候,查詢速度提升極大 ...
索引的概念
不使用索引,要操作某些行時,需要遍歷遍歷整張表來找到匹配的行,很花時間,且有點耗資源。
書:目錄=>快速定位到指定章節,不用一頁一頁地找
資料庫:索引=>快速定位到指定記錄,不用遍曆數據表去找,索引相當於數據表的目錄
索引的優缺點
- 提高查詢效率,尤其是記錄數超級多的時候,查詢速度提升極大(優)
- 沒有遍曆數據表的資源開銷(優)
- 索引也是一張表,要占空間,有額外的空間開銷(缺)
- 增改刪會同步到索引(維護索引),有額外的時間、資源開銷,會降低增改刪的效率(缺)
常見的幾種索引
- 單值索引:索引中只包含數據表的一列(一個欄位)
- 唯一索引:索引中列的每個值必須唯一,一般是數據表的主鍵列
- 複合索引:索引中包含數據表的多個列
- 全文索引:只能對MyISAM引擎的表使用,且索引中的列要是char、varchar、text等文本類型
索引常用操作
create index index_student on tb_student(id,name); #創建索引,指定索引名稱,要使用哪張表的哪些欄位來創建索引
drop index index_student on tb_student; #刪除索引
show index from tb_student; #查看某個表上所有的索引
其實不管是索引,還是視圖,都很少用命令行來操作,太麻煩,一般都是在資料庫管理工具(比如Navicat)中直接操作。
索引是在 表結構|表定義|設計表 中操作的。
索引方式
索引方式有2種:
(1)btree 使用b+樹的方式建立索引
比如選擇id列來創建索引,假設有7條記錄,id 1~7
查找id=7的記錄的地址:4 -> 6 -> 7
一般都是使用btree,因為很多存儲引擎都支持btree。InnoDB只支持btree,不支持hash。
(2)hash 通過hash值一次直接找到記錄的地址
比如使用id列建立索引,查找id=7的記錄,根據7的hash值直接定位到對應記錄的地址。
btree要一級級的找,要通過多個節點;hash一次就找到,查詢效率遠高於btree。
但hash用得較少,因為只有memory存儲引擎支持hash。
說明
- 一張表添加主鍵時,會自動給主鍵列創建唯一索引(Unique);添加外鍵時,會自動給外鍵列創建普通索引(Normal)。
- 在資料庫管理工具(navicat)中能看到外鍵自動創建的索引,但看不到主鍵自動創建的索引;在mysql自帶的命令行客戶端使用 show index from 表名; 可以看到該表所有的索引,包括主鍵自動創建的索引。
- 創建索引後,從表中找匹配的記錄時會自動選擇合適的索引來使用,不需要我們指定索引。
哪些欄位適合創建索引?
- 主鍵
- 外鍵 這2個不用管,會自動創建
- 頻繁作為條件的欄位,比如經常要用where name=' xxx',那就給name欄位創建索引
- group by分組使用的欄位
- order by排序使用的欄位
- 統計(聚合函數)使用的欄位
哪些欄位不適合創建索引?
- 頻繁更新(update)的欄位。要頻繁同步到索引(維護索引),開銷很大。
- 有很多重覆值的欄位。比如dep_id,tb_student很多記錄的dep_id都是相同的。
哪些表不用創建索引?
- 記錄很少的表
- 經常進行增刪改的表。維護索引開銷大