❶ 資料庫中怎麼建立索引
1.資料庫中的索引分為兩種類型,分別是普通索引、唯一索引。下面讓我們來分別介紹一下這...
2.第一種是普通索引,CREATE INDEX indexName ON mytable(...
3.第二種是唯一索引,它與普通索引是類似的,但也存在不同之處,不同之處在於索引列的值...
4.以上三張圖分別為創建索引、修改表結構、創建表時直接指定的數據。而且還有四種方式來...
5.第一種方式:ALTER TABLE tbl_name ADD PRIMARY KEY (...
❷ 為什麼資料庫表要建立索引
索引是以表列為基礎的資料庫對象。索引中保存著表中排序的索引列,並且紀錄了索引列在資料庫表中的物理存儲位置,實現了表中數據的邏輯排序。通過索引,可以加快數據的查詢速度和減少系統的響應時間;可以使表和表之間的連接速度加快。
用sql建立索引:
為了給一個表建立索引,啟動任務欄SQL
Sever程序組中的ISQL/w程序。進入查詢窗口後,輸入下面的語句:
CREATE
[UNIQUE]
[CLUSER]
INDEX
ON
();
UNIQUE
表明此索引的每一個索引值只對應唯一的數據記錄
CLUSTER
表明要建立的是聚簇索引(指索引項的順序與表中記錄的物理順序一致)
例:CREATE
CLUSER
INDEX
Stuname
ON
Student(Sname);
在student表的sname列建立一個聚簇索引,student中記錄按照sname值的升序排列
參考資料:
<
❸ 資料庫索引創建需考慮因素
1.數據量超過三百,理論上應創建索引
2.經常與其他表鏈接的表,在鏈接欄位應創建索引 on 兩邊的欄位,都要建立索引
3.經常出現在where子句中的欄位,尤其是大表,應創建索引
4.索引應創建在選擇性高,重復度低的欄位上,如員工表,姓名和性別都作為查詢條件,姓名更適合建立索引。如果兩個同時建立了索引,MySQL也會自動選擇以姓名作為索引查詢
5.索引應該建立在小欄位上,對於大的文本甚至超長欄位,盡量不建立索引
6.復合索引
① 正確選擇復合索引中的主列欄位,一般是選擇性較好的欄位
② 復合索引的幾個欄位是否經常同時以AND方式出現在Where子句中?單欄位查詢是否極少甚至沒有? 如果是,則可以建立復合索引;否則考慮單欄位索引
③ 如果復合索引中包含的欄位經常單獨出現在Where子句中,則分解為多個單欄位索引
④ 如果既有單欄位索引,又有這幾個欄位上的復合索引,一般可以刪除復合索引
7.索引維護也需要成本,頻繁增刪的數據表,謹慎選擇索引
❹ 資料庫表如何建立索引
資料庫表中的時間欄位是否可以建立索引?
可以建立索引的;至於建立聚集索引或者是非聚集索引,那要看你這個時間欄位的具體情況以及使用或變更頻繁程度。
一般來說,適合建立聚集索引的要求:「既不能絕大多數都相同,又不能只有極少數相同」的規則。
先說說一個誤區:有人認為:只要建立索引就能顯著提高查詢速度。這個想法是很錯誤的。建立非聚集索引,確實,一般情況下可以提高速度,但是一般並不會達到你想要的速度。只有在適當的列建立適當的(聚集)索引,才能達到滿意的效果。
下面的表總結了何時使用聚集索引或非聚集索引(很重要)。
動作描述
使用聚集索引
使用非聚集索引
列經常被分組排序
應
應
返回某范圍內的數據
應
不應
一個或極少不同值
不應
不應
小數目的不同值
應
不應
大數目的不同值
不應
應
頻繁更新的列
不應
應
外鍵列
應
應
主鍵列
應
應
頻繁修改索引列
不應
應
別的就要看你的理解了。
❺ 資料庫索引有哪幾種,怎樣建立索引
資料庫索引的種類:
1、按照索引列值的唯一性,索引可分為唯一索引和非唯一索引
非唯一索引:B樹索引
create index 索引名 on 表名(列名) tablespace 表空間名;
唯一索引:建立主鍵或者唯一約束時會自動在對應的列上建立唯一索引
2、索引列的個數:單列索引和復合索引
3、按照索引列的物理組織方式
B樹索引
create index 索引名 on 表名(列名) tablespace 表空間名;
點陣圖索引
create bitmap index 索引名 on 表名(列名) tablespace 表空間名;
反向鍵索引
create index 索引名 on 表名(列名) reverse tablespace 表空間名;
函數索引
create index 索引名 on 表名(函數名(列名)) tablespace 表空間名;
刪除索引
drop index 索引名
重建索引
alter index 索引名 rebuild
索引的創建格式:
CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>
ON <schema>.<table_name>
(<column_name> | <expression> ASC | DESC,
<column_name> | <expression> ASC | DESC,...)
TABLESPACE <tablespace_name>
STORAGE <storage_settings>
LOGGING | NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS | COMPRESS<nn>
NOSORT | REVERSE
PARTITION | GLOBAL PARTITION<partition_setting>
UNIQUE | BITMAP:指定UNIQUE為唯一值索引,BITMAP為點陣圖索引,省略為B-Tree索引。
<column_name> | <expression> ASC | DESC:可以對多列進行聯合索引,當為expression時即「基於函數的索引」
TABLESPACE:指定存放索引的表空間(索引和原表不在一個表空間時效率更高)
STORAGE:可進一步設置表空間的存儲參數
LOGGING | NOLOGGING:是否對索引產生重做日誌(對大表盡量使用NOLOGGING來減少佔用空間並提高效率)
COMPUTE STATISTICS:創建新索引時收集統計信息
NOCOMPRESS | COMPRESS<nn>:是否使用「鍵壓縮」(使用鍵壓縮可以刪除一個鍵列中出現的重復值)
NOSORT | REVERSE:NOSORT表示與表中相同的順序創建索引,REVERSE表示相反順序存儲索引值
PARTITION | NOPARTITION:可以在分區表和未分區表上對創建的索引進行分區
使用USER_IND_COLUMNS查詢某個TABLE中的相應欄位索引建立情況
使用DBA_INDEXES/USER_INDEXES查詢所有索引的具體設置情況。
在Oracle中的索引可以分為:B樹索引、點陣圖索引、反向鍵索引、基於函數的索引、簇索引、全局索引、局部索引等,下面逐一講解:
一、B樹索引:
最常用的索引,各葉子節點中包括的數據有索引列的值和數據表中對應行的ROWID,簡單的說,在B樹索引中,是通過在索引中保存排過續的索引列值與相對應記錄的ROWID來實現快速查詢的目的。其邏輯結構如圖:
反向鍵索引是一種特殊的B樹索引,在存儲構造中與B樹索引完全相同,但是針對數值時,反向鍵索引會先反向每個鍵值的位元組,然後對反向後的新數據進行索引。例如輸入2008則轉換為8002,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。
反向鍵索引的創建示例:
createindex ind_t on t1(id) reverse;
註:鍵的反轉由系統自行完成。對於用戶是透明的。
四、基於函數的索引:
有的時候,需要進行如下查詢:select * from t1 where to_char(date,'yyyy')>'2007';
但是即便在date欄位上建立了索引,還是不得不進行全表掃描。在這種情況下,可以使用基於函數的索引。其創建語法如下:
create index ind_t on t1(to_char(date,'yyyy'));
註:簡單來說,基於函數的索引,就是將查詢要用到的表達式作為索引項。
五、全局索引和局部索引:
這個索引貌似很復雜,其實很簡單。總得來說一句話,就是無論怎麼分區,都是為了方便管理。
具體索引和表的關系有三種:
1、局部分區索引:分區索引和分區表1對1
2、全局分區索引:分區索引和分區表N對N
3、全局非分區索引:非分區索引和分區表1對N
創建示例:
首先創建一個分區表
createtable student
(
stuno number(5),
sname vrvhar2(10),
deptno number(5)
)
partition by hash (deptno)
(
partition part_01 tablespace A1,
partition part_02 tablespace A2
);
創建局部分區索引(1v1):
create index ind_t on student(stuno)
local(
partition part_01 tablespace A2,
partition part_02 tablespace A1
);--local後面可以不加
創建全局分區索引(NvN):
create index ind_t on student(stuno)
globalpartition by range(stuno)
(
partition p1 values less than(1000) tablespace A1,
partition p2 values less than(maxvalue) tablespace A2
);--只可以進行range分區
創建全局非分區索引(1vN)
createindex ind_t on student(stuno) GLOBAL;
❻ 資料庫為什麼要建索引
大部分開發會了解這樣的《開發規范》:創建索引要選擇區分度高的欄位。他們會認為區分度低的欄位不適合創建索引或者不適合添加到組合索引裡面。但是這樣的操作會導致很多慢查。舉例來說:
select * from tab where a=1 and b=2;
場景 1
符合 a=1的記錄數有 10w 條記錄 ,b=2 有 1000 條記錄。如果只是創建idx_a(a),sql 請求通過索引idx_a訪問 10w 條件記錄,然後還要逐一匹配 10w 條記錄中的 status,找到符合 b=2的記錄。這個動作會導致慢查。如果創建組合索引idx_ab(a,b),sql 請求通過索引idx_ab可以直接定位到 1000 條記錄,無需額外的過濾。這樣減少訪問 9900 條記錄的時間,提升查詢速度。
場景 2
符合 a=1的有 100 條記錄,status=2 有 10 條記錄。其實場景 2 因為數據量比較少,直接訪問 100 條記錄和定位到 10 條記錄的時間消耗相差不大,量變不足以引發質變,可以忽略了。
Tips:
創建索引的目的是通過索引盡可能找到匹配 where 條件的行,減少不必要的回表,提高查詢效率;
需要辯證地看待區分度比較低的欄位在組合索引中的作用。在組合索引的情況下,我們不能只是單純地看欄位的區分度,而是要看符合條件的記錄數是多少。符合條件的記錄越少,性能越好。
❼ 資料庫索引有哪幾種怎樣建立索引
種類:
1、按照索引列值的唯一性,索引可分為唯一索引和非唯一索引;
非唯一索引:
create index 索引名 on 表名(列名) tablespace表空間名;
唯一索引:
建立主鍵或者唯一約束時會自動在對應的列上建立唯一索引;
2、索引列的個數:單列索引和復合索引;
3、按照索引列的物理組織方式。
索引的創建格式:
CREATEUNIUQE|BITMAPINDEX<schema>.<index_name>ON<schema>.<table_name>(<column_name>|<expression>ASC|DESC,<column_name>|<expression>ASC|DESC,...)TABLESPACE<tablespace_name>STORAGE<storage_settings>LOGGING||COMPRESS<nn>NOSORT|REVERSEPARTITION|GLOBALPARTITION<partition_setting>
使用USER_IND_COLUMNS查詢某個TABLE中的相應欄位索引建立情況
使用DBA_INDEXES/USER_INDEXES查詢所有索引的具體設置情況。
在Oracle中的索引可以分為:B樹索引、點陣圖索引、反向鍵索引、基於函數的索引、簇索引、全局索引、局部索引等,下面逐一講解:
一、B樹索引:
最常用的索引,各葉子節點中包括的數據有索引列的值和數據表中對應行的ROWID,簡單的說,在B樹索引中,是通過在索引中保存排過續的索引列值與相對應記錄的ROWID來實現快速查詢的目的。其邏輯結構如圖:
可以保證無論用戶要搜索哪個分支的葉子結點,都需要經過相同的索引層次,即都需要相同的I/O次數。
B樹索引的創建示例:
create index ind_t on t1(id);
注1:索引的針對欄位創建的,相同欄位不能創建一個以上的索引;
注2:默認的索引是不唯一的,但是也可以加上unique,表示該索引的欄位上沒有重復值(定義unique約束時會自動創建);
注3:創建主鍵時,默認在主鍵上創建了B樹索引,因此不能再在主鍵上創建索引。
二、點陣圖索引:
有些欄位中使用B樹索引的效率仍然不高,例如性別的欄位中,只有「男、女」兩個值,則即便使用了B樹索引,在進行檢索時也將返回接近一半的記錄。
所以當欄位的基數很低時,需要使用點陣圖索引。(「低」的標準是取值數量 < 行數*1%)
反向鍵索引是一種特殊的B樹索引,在存儲構造中與B樹索引完全相同,但是針對數值時,反向鍵索引會先反向每個鍵值的位元組,然後對反向後的新數據進行索引。例如輸入2008則轉換為8002,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。
反向鍵索引的創建示例:
createindex ind_t on t1(id) reverse;
註:鍵的反轉由系統自行完成。對於用戶是透明的。
四、基於函數的索引:
有的時候,需要進行如下查詢:select * from t1 where to_char(date,'yyyy')>'2007';
但是即便在date欄位上建立了索引,還是不得不進行全表掃描。在這種情況下,可以使用基於函數的索引。其創建語法如下:
create index ind_t on t1(to_char(date,'yyyy'));
註:簡單來說,基於函數的索引,就是將查詢要用到的表達式作為索引項。
五、全局索引和局部索引:
這個索引貌似很復雜,其實很簡單。總得來說一句話,就是無論怎麼分區,都是為了方便管理。
具體索引和表的關系有三種:
1、局部分區索引:分區索引和分區表1對1
2、全局分區索引:分區索引和分區表N對N
3、全局非分區索引:非分區索引和分區表1對N
創建示例:
首先創建一個分區表
createtable student
(
stuno number(5),
sname vrvhar2(10),
deptno number(5)
)
partition by hash (deptno)
(
partition part_01 tablespace A1,
partition part_02 tablespace A2
);
創建局部分區索引(1v1):
create index ind_t on student(stuno)
local(
partition part_01 tablespace A2,
partition part_02 tablespace A1
);--local後面可以不加
創建全局分區索引(NvN):
create index ind_t on student(stuno)
globalpartition by range(stuno)
(
partition p1 values less than(1000) tablespace A1,
partition p2 values less than(maxvalue) tablespace A2
);--只可以進行range分區
創建全局非分區索引(1vN)
createindex ind_t on student(stuno) GLOBAL;
❽ 資料庫中的索引有什麼用
先正面回答你的問題
數據是否重復不是建立索引的重要依據,甚至都不是依據。
只要不完全重復(所有元組的該元素都一樣),那麼建立索引就是有意義的。
即使當前數據完全重復,也不是不能建立索引,這種情況有點復雜,不細說了。
對於你後面的疑問,可以給你一個如何建立索引的忠告,「如何查就如何建」。
索引的建立,唯一的原因就是為了查詢(廣義的查詢),實際上建立索引會使得數據存儲所佔空間變大,有時索引所佔的空間會查過數據本身的空間。索引的建立也會使得數據插入時變慢,特殊情況下,慢的難以忍受,所以dba的重要工作之一,就是檢查索引層級並優化。
索引建立的唯一好處,就是按照索引查詢時,變快了。type,status這2個欄位是否適合建立索引,就要看你是否要按照這2個欄位進行檢索。而檢索的順序決定了如何建立索引。
對於索引類型和索引方式,我建議就
normal
和
btree
就適用於大多數情況。若你參與的是一個大數據處理項目,對數據存儲和檢索有特別要求,那麼需要分析多個層面,比如數據吞吐量、數據的方差、平均差等等很多參數才考慮是否用聚集索引等(mysql好像還沒聚集索引),至於是否是唯一索引,我建議不使用,即使能判定數據是唯一的也不要用,全文索引也沒有必要。
❾ 資料庫系統概論簡答題創建索引的必要性和作用
資料庫中建立索引的必要性和作用是:
1、加快數據檢索速度;
2、通過創建唯一索引,可以保證每一行數據的唯一性;
3、加速表與表之間的連接,特別是在實現數據的參照完整性方面具有特別的意義;
4、在使用order和group by子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間;
5、通過使用索引,可以在查詢過程中使用查詢優化器,提高系統性能。