索引
添加索引是給某一個(gè)字段殖氏,或者說某些字段添加索引。
select ename,sal from emp where ename='SMITH';
當(dāng)ename字段上沒有添加索引的時(shí)候译秦,以上sql語句會(huì)進(jìn)行全表掃描远搪,掃描ename字段中的所有的值劣纲。
什么時(shí)候考慮給字段添加索引?(滿足什么條件)
-數(shù)據(jù)量龐大谁鳍。(根據(jù)客戶要求癞季,根據(jù)線上的環(huán)境)
-該字段很少的DML操作劫瞳。(因?yàn)樽侄芜M(jìn)行修改操作,索引也需要維護(hù))
-該字段經(jīng)常出現(xiàn)在where子句中绷柒。(經(jīng)常根據(jù)哪個(gè)字段查詢)
注意:主鍵和具有unique約束的字段自動(dòng)會(huì)添加索引志于。根據(jù)主鍵查詢效率較高。盡量根據(jù)主鍵查詢废睦。
創(chuàng)建索引對(duì)象:create index 索引名稱 on 表名(字段名)伺绽;
刪除索引對(duì)象:drop index 索引名稱 on 表名;
查看sql語句的執(zhí)行計(jì)劃:
explain select ename嗜湃,sal from emp where sal=5000奈应;
給薪資sal字段添加索引:
create index emp_sal_index on emp(sal);
索引底層采用的數(shù)據(jù)結(jié)構(gòu)是:B+Tree
索引的實(shí)現(xiàn)原理?
通過B Tree縮小掃描范圍购披,底層索引進(jìn)行了排序杖挣,分區(qū),索引會(huì)攜帶數(shù)據(jù)在表中的“物理地址”今瀑,最終通過索引檢索到數(shù)據(jù)之后程梦,獲取到關(guān)聯(lián)的物理地址点把,通過物理地址定位表中的數(shù)據(jù)橘荠,效率是最高的。
select ename from emp where ename='SMITH';
通過索引轉(zhuǎn)換為:
select ename from emp where 物理地址=0x3郎逃;
索引的分類哥童?
-單一索引:給單個(gè)字段添加索引
-復(fù)合索引:給多個(gè)字段聯(lián)合起來添加一個(gè)索引
-主鍵索引:主鍵上會(huì)自動(dòng)添加索引
-唯一索引:有unique約束的字段上會(huì)自動(dòng)添加索引
索引什么時(shí)候失效?
select ename from emp where ename like '%A%';
模糊查詢的時(shí)候褒翰,第一個(gè)通配符使用的是%贮懈,這個(gè)時(shí)候索引是失效的。
視圖
什么是視圖优训?
站在不同的角度去看到數(shù)據(jù)朵你。(同一張表的數(shù)據(jù),通過不同的角度去看待)
怎么創(chuàng)建視圖揣非?怎么刪除視圖抡医?
create view myview as select empno,ename from emp;
drop view myview;
注意:只有對(duì)DQL語句才能以視圖對(duì)象的方式創(chuàng)建出來。
對(duì)視圖進(jìn)行增刪改查早敬,會(huì)影響到原表數(shù)據(jù)忌傻。(通過視圖影響原表數(shù)據(jù)的,不是直接操作的原表)可以對(duì)視圖進(jìn)行CRUD操作
create table emp_bak as select * from emp;
create view myview as select empno,ename,sal from emp_bak;
update myview set ename='hehe',sal=1 where empno=7369;//通過視圖修改原表數(shù)據(jù)搞监。
delete from myview where empno=7369;//通過視圖刪除原表數(shù)據(jù)水孩。
視圖的作用?
視圖可以隱藏表的實(shí)現(xiàn)細(xì)節(jié)琐驴。保密級(jí)別較高的系統(tǒng)俘种,數(shù)據(jù)庫只對(duì)外提供相關(guān)的視圖秤标,java程序員只對(duì)視圖對(duì)象進(jìn)行CRUD操作。