什么是索引?
索引是協(xié)助數(shù)據(jù)庫快速查找數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)
在數(shù)據(jù)庫中妇蛀,查詢一張表有兩種方式:
第一種方式:全表掃描
第二種方式:根據(jù)索引檢索
索引為什么可以提高檢索效率呢?
最根本的原理是縮小了掃描的范圍
索引雖然可以提高檢索效率评架,但是不能隨意的添加索引,因?yàn)樗饕彩菙?shù)據(jù)庫當(dāng)中的對象纵诞,也需要數(shù)據(jù)庫的維護(hù)。比如挣磨,表中的數(shù)據(jù)經(jīng)常被修改這樣就不適合添加索引荤懂,因?yàn)閿?shù)據(jù)一旦修改,索引需要重新排序节仿。
(1)用select *數(shù)據(jù)庫需要解析更多的字段廊宪,在sql語句復(fù)雜的情況下,會(huì)對數(shù)據(jù)庫造成沉重的負(fù)擔(dān)壕翩。
(2)增大網(wǎng)絡(luò)開銷:當(dāng)無用的字段是一些大文本字段的時(shí)候,如果DB和應(yīng)用程序不在同一臺(tái)機(jī)器放妈,這種開銷就非常明顯。
(3)失去Mysql優(yōu)化器“覆蓋索引”策略優(yōu)化的可能性:比如說一張表中存在一個(gè)主鍵索引和一個(gè)輔助索引芜抒。在mysql中托启,如果查詢條件中where條件可以通過普通索引過濾掉一部分記錄宅倒,查詢會(huì)先走普通索引屯耸,如果用戶只需要加了輔助索引列的數(shù)據(jù),那么直接通過輔助索引就可以知道用戶查詢的數(shù)據(jù)疗绣。如果用戶通過select *,獲取了不需要的數(shù)據(jù)持痰,則首先通過輔助索引過濾數(shù)據(jù),然后再通過聚集索引獲取所有的列割卖,這就多了一次b+樹查詢前酿,速度必然會(huì)慢很多鹏溯。
怎么創(chuàng)建索引,怎么刪除索引
創(chuàng)建索引語法:create index 索引名稱 on 表名(字段名)
create index emp_sal_index on emp(sal);
刪除索引對象:drop index 索引名稱 on 表名;
什么時(shí)候考慮添加索引
*數(shù)據(jù)量龐大(根據(jù)客戶的需求丙挽,線上的環(huán)境)
*該字段很少的DML操作
*該字段經(jīng)常出現(xiàn)在where子句中
注意:主鍵和具有unique約束的字段自動(dòng)會(huì)添加索引
索引的分類:
單一索引:給單個(gè)字段添加索引
復(fù)合索引:給多個(gè)字段聯(lián)合起來添加1個(gè)索引
主鍵索引:主鍵上會(huì)自動(dòng)添加索引
唯一索引:有unique約束的字段會(huì)自動(dòng)添加索引
說說最左匹配?
以最左邊的字段為起點(diǎn)任何連續(xù)的索引都能匹配上平窘,當(dāng)遇到范圍查詢(>、<瑰艘、between肤舞、like)就會(huì)停止匹配
聚簇索引:
1>只能來自于采用Innodb存儲(chǔ)引擎表的數(shù)據(jù)
2>mysql自動(dòng)將采用Innodb存儲(chǔ)