1.UNIQUE 關(guān)鍵字建唯一索引
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的七里河網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
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.聯(lián)合索引
ALTER TABLE `tasks`
ADD INDEX `testabc` (`title`, `created`) ;
3聯(lián)合唯一索引(假設(shè)有這個需求,在同一天內(nèi)不能建兩個tiltle一樣的任務(wù))
ALTER TABLE `tasks`
ADD UNIQUE INDEX `testabc` (`title`, `created`) ;
數(shù)據(jù)庫建索引的科學(xué)性事關(guān)數(shù)據(jù)庫性能,索引也不是越多越好。
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列上建立聯(lián)合索引了。
如果表已經(jīng)建好了,那么就在phpmyadmin里面執(zhí)行:
alert table test add INDEX `sindex` (`aaa`,`bbb`,`ccc`)
就可以在這3列上建立聯(lián)合索引了。
引入一個面試問題:
看完以下以后再回顧,會發(fā)現(xiàn)迎刃而解
Mysql 可以為每一張表設(shè)置 存儲引擎 這里我們只說 InnoDB 存儲引擎.
由于實際情況,數(shù)據(jù)頁只能按照一棵 B+樹 進行排序, 因此每張表只能擁有一個 聚集索引(即 主鍵)。
栗子:
每個葉子節(jié)點的索引行中包含了一個書簽(bookmark). 該書簽是用來告訴 InnoDB存儲引擎哪里可以找到該索引對應(yīng)的數(shù)據(jù)行或者說 行數(shù)據(jù)! 由于InnoDB存儲引擎表, 是按照主鍵來構(gòu)建的, 所以 ,該書簽內(nèi)其實包含或者說指向了 數(shù)據(jù)行所對應(yīng)的聚集索引鍵
也就是說 輔助索引的 葉結(jié)點保存了 指向?qū)?yīng)數(shù)據(jù)的 聚集索引, 可以通過該聚集索引 找到對應(yīng)的數(shù)據(jù)行
輔助索引的存在并不影響數(shù)據(jù)在聚集索引中的組織,因為每張表上可以有多個輔助索引。
當(dāng)通過輔助索引來尋找數(shù)據(jù)時,InnoDB 存儲引擎會遍歷輔助索引并通過葉級別的指針獲得指向主鍵索引(聚集索引)的主鍵,然后再通過聚集索引找到一個完整的數(shù)據(jù)行。
例如:
聚集索引輔助索引關(guān)系:
: 又叫做組合索引 , 輔助索引的一種 , 和普通創(chuàng)建索引的方式一樣,不同的是 可以同時添加多列來作為索引項;
從本質(zhì)上來說,聯(lián)合索引也是一課B+樹
個人理解: 所謂最左原則, 是因為 存儲引擎構(gòu)建組合索引時 是根據(jù)最左邊的那一列索引項進行排序的 ,所以使用組合索引,必須滿足 條件中必須存在 最左邊那一列的索引項,這樣 才可以找到對應(yīng)的索引,繼而 去尋找對應(yīng)的數(shù)據(jù)
: 又叫做 索引覆蓋,InnoDB中支持覆蓋索引,即 從輔助索引中就可以得到查詢的記錄,而不需要查詢聚集索引中的記錄。
比如 這里沒有根據(jù)最左原則使用組合索引,但是 優(yōu)化器依然進行選擇
共勉,歡迎指導(dǎo)謝謝~
InnoDB按照主鍵進行聚集,如果沒有定義主鍵,InnoDB會試著使用唯一的非空索引來代替。如果沒有這種索引,InnoDB就會定義隱藏的主鍵然后在上面進行聚集。
所以,對于 聚集索引 來說,你創(chuàng)建主鍵的時候,自動就創(chuàng)建了主鍵的聚集索引。
而普通索引(非聚集索引)的語法,大多數(shù)數(shù)據(jù)庫都是通用的:
CREATE INDEX Syntax
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_type]
index_col_name:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH | RTREE}
[java] view plaincopy
-- 創(chuàng)建無索引的表格
create table testNoPK (
id int not null,
name varchar(10)
);
-- 創(chuàng)建普通索引
create index IDX_testNoPK_Name on testNoPK (name);