資料庫聯合索引
『壹』 資料庫的索引是如何實現的,主鍵索引和聯合索引數據結構有什麼區別
主鍵是表中的一個或多個欄位,它的值用於惟一地標識表中的某一條記錄.且不能為空;
索引是對資料庫表中一列或多列的值進行排序的一種結構,只有當經常查詢索引列中的數據時,才需要在表上創建索引,使用索引可快速訪問資料庫表中的特定信息。
索引佔用磁碟空間,並且降低添加、刪除和更新行的速度。當然索引也有好處就是查詢速度快,它利還是大於弊的所以請慎重使用索引。
比如:一個學生表(t_stu
)有1000條數據,給它id列建個主鍵和索引,
你想查詢id=1000;的這條信息,如果沒有索引,它就一條一條的比對查找,系統運行1000次才找到,要是創建了索引,你查詢id=1000的這條信息,系統只運行一次就找到了。
『貳』 什麼是mysql的聯合索引,怎麼建立mysql的索引。
聯合索引是由多個欄位組成的索引。
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name (index_col_name,...)
index_col_name:
col_name [(length)] [ASC | DESC]
如果你經常要用到多個欄位的多條件查詢,可以考慮建立聯合索引,一般是除第一個欄位外的其它欄位不經常用於條件篩選情況,比如說a,b 兩個欄位,如果你經常用a條件或者a+b條件去查詢,而很少單獨用b條件查詢,那麼可以建立a,b的聯合索引。如果a和b都要分別經常獨立的被用作查詢條件,那還是建立多個單列索引。
『叄』 mysql聯合索引如何創建
1.UNIQUE關鍵字建唯一索引
mysql> CREATE TABLE `wb_blog` (
-> `id` smallint(8) unsigned NOT NULL,
-> `catid` smallint(5) unsigned NOT NULL DEFAULT '0',
-> `title` varchar(80) NOT NULL DEFAULT '',
-> `content` text NOT NULL,
-> PRIMARY KEY (`id`),
-> UNIQUE KEY `catename` (`catid`)
-> ) ;
如果建好表了,可以用以下語句建
mysql> CREATE UNIQUE INDEX catename ON wb_blog(catid);
2.聯合索引
ALTER TABLE `tasks`
ADD INDEX `testabc` (`title`, `created`) ;
3聯合唯一索引(假設有這個需求,在同一天內不能建兩個tiltle一樣的任務)
ALTER TABLE `tasks`
ADD UNIQUE INDEX `testabc` (`title`, `created`) ;
資料庫建索引的科學性事關資料庫性能,索引也不是越多越好。
『肆』 資料庫索引有哪幾種,怎樣建立索引
資料庫索引的種類:
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;
『伍』 mysql聯合索引如何創建
CREATE TABLE `test` ('aaa' varchar(16) NOT NULL default '', 'bbb' varchar(16) NOT NULL default '', 'ccc' int(11) UNSIGNED NOT NULL default 0, KEY `sindex` (`aaa`,`bbb`,`ccc`) ) ENGINE=MyISAM COMMENT='';
這樣就在 aaa、bbb、ccc 3列上建立聯合索引了。
如果表已經建好了,那麼就在phpmyadmin裡面執行:
alert table test add INDEX `sindex` (`aaa`,`bbb`,`ccc`)
就可以在這3列上建立聯合索引了。
『陸』 mysql覆蓋索引和聯合索引的區別
聯合索引和覆蓋索引有很大的區別:
覆蓋索引是查詢的列可以直接通過索引提取,比如只查詢主鍵的列!或者查詢聯合索引的所有列或者左邊開始的部分列(注意有順序的)!
而聯合索引並不一定只從索引中能獲取到所有的數據,這個取決於你所查詢的列。比如select * from table where ××××××;的方式就不太可能是覆蓋索引。因此如果你查詢的列能用到聯合索引,且你查詢的列都能通過聯合索引獲取,比如你只查詢聯合索引所在的列或者左邊開始的部分列,這就相當於覆蓋索引了。通常為了讓查詢能用到覆蓋索引,就將要查詢的多列數據設置成聯合索引。
『柒』 mysql中,索引,主鍵,唯一索引,聯合索引的區別是對資料庫的性能有什麼影響
索引就相當於對指定的列進行排序,排序有利於對該列的查詢,可以大大增加查詢效率,
建立索引也是要消耗系統資源,所以索引會降低寫操作的效率;
主鍵,唯一,聯合都屬於索引;
主鍵屬於唯一索引,且一個表只能有一個主鍵,主鍵列不允許空值;唯一索引可以一個表中可以有多個,而且允許為空,列中的值唯一;多個欄位的多條件查詢多使用聯合索引。
『捌』 Mysql多表聯合索引
Mysql多表聯合索引:
1、多表聯合索引在查詢語句中能加速查詢速度。select * from table1,table2 where table1.id = table2.id。
2、多表聯合的索引的sql語法,一個user表有4個欄位 id name age sex,分別給name age sex建立三個單獨的索引,此時建立create index name_age_sex on user(name,age,sex)這個新建立的索引跟前面那三個是獨立的。就是說又新建立了空間存儲這個新索引。
3、索引的維護主要包括定期清理數據碎片。
『玖』 什麼是mysql的聯合索引,如何建立mysql的索引
聯合索引是由多個欄位組成的索引。CREATE
[UNIQUE|FULLTEXT|SPATIAL]
INDEX
index_name[USING
index_type]ON
tbl_name
(index_col_name,...)index_col_name:col_name[(length)]
[ASC
|
DESC]如果你經常要用到多個欄位的多條件查詢,可以考慮建立聯合索引,一般是除第一個欄位外的其它欄位不經常用於條件篩選情況,比如說a,b
兩個欄位,如果你經常用a條件或者a+b條件去查詢,而很少單獨用b條件查詢,那麼可以建立a,b的聯合索引。