索引
索引的優缺點
優點:創建索引可以大大提高系統的性能。
第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
第二,可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四,在使用分組和排序 子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
缺點:降低了系統的維護速度和增大了空間需求
第一,創建索引和維護索引要耗費時間,這種時間隨着數據 量的增加而增加。
第二,索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
主鍵,外鍵
(primary key[列名,[列名]])
create table emp (
id number(6) primary key,--主鍵
name varchar2(20) not null,--非空
sex number(1),
age number(3) default 18,
email varchar2(25) unique,--唯一
deptno number(2) references dept(deptno)—外鍵
);
帶約束名稱:
create table emp (
id number(6) constraint id_pk primary key,
name varchar2(20) constraint name_nn not null,
sex number(1),
age number(3) default 18,
email varchar2(25) constraint email_uqe unique,
deptno number(2) constraint dept_deptno_ref references dept(deptno)
);
列模式:
create table emp (
id number(6),
name varchar2(20),
sex number(1),
age number(3) default 18,
email varchar2(25),
deptno number(2),
constraint id_pk primary key (id),--也可以兩個以上,聯合主鍵
constraint dept_deptno_ref foreign key (deptno) references dept(deptno),
constraint emial_name_uqe unique (email, name)
);
主鍵索引
主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。
主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行數據更新、刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外鍵構成參照完整性約束,防止出現數據不一致。數據庫在設計時,主鍵起到了很重要的作用。
主鍵可以保證記錄的唯一和主鍵域非空,數據庫管理系統對於主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。
**唯一索引 **
- **create unique index idx_emp_ename on 表名(column); **
創建索引
普通索引:
- **create index 索引名 on dept(column); **
聯合索引:
- create index 索引名 on dept(column[, column[, column]]);
**反向鍵索引 **
- **create index 索引名 on 表名(column) reverse; **
**位圖索引 **
- **create bitmap index 索引名 on 表名(column); **
**索引組織表,一定要有主鍵 **
create table tab (
id int primary key,
name varchar2(20)
) organization index;
注:索引組織表的insert效率非常低
**分區表索引 **
create index 索引名 on table(column) local/global;
提示:當給表創建主鍵或唯一鍵約束時,系統也會創建一個約束給該字段;同樣創建索引也會占用數據庫空間;索引在訪問、查詢的時候效率有提高,但是在修改表的時候效率就會降低;
自動增長序列
mysql
mysql不自帶sequence,但是可以設置自動增長序列,設置是必須要有主鍵(primary key)
創建表時創建
creat table emp(
id int auto_increment primary key,
.....
);
創建表后添加
- alter table emp add id int auto_increment primary key;
設置自增序列的啟始值
- alter table emp auto_increment=2;
注:也可以讓自增序列值從123變為2,從2重新開始;
oracle
創建自增序列
- **create sequence 序列名; **
- select seq.nextval from dual;
使用時的名字為
- **序列名.nextval **
**create sequence 序列名
start with 2 –從2開始
increment by 3—每次加3
nomaxvalue—沒有最大值
minvalue 1—最小值1
nocycle—不循環
nocache;--不緩存 **
**修改序列的序列值 **
**alter sequence seqtab
maxvalue 1000; **
注:不能修改為起始值
修改序列值可以先查詢出來再increment修改回來
select sql.nextval from dual;
alter sequence seq increment by 79;
序列已更改
創建視圖
如果需要經常執行某項復雜的查詢,可以基於復雜查詢建立此視圖即可,簡化復雜查詢;
視圖本質上就是一條select語句,所以當訪問視圖時,只能訪問到所對應的的select語句中涉及到的列,對基表中的其他列起到安全和保密的作用,可以限制數據訪問
授權創建視圖
- crant create view to 用戶
創建視圖
- crate view 視圖名 as select * from 表名 where ···
查看視圖結構
- select * from 視圖名
