索引被用來快速找出在一個列上用一特定值的行。沒有索引,MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。
所有的MySQL索引(primary、unique和index) 在B樹中存儲。字符串是自動地壓縮前綴和結尾空間。
CREATE TABLE `user_paper` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`courseId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '課程id',
`userId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用戶ID',
`paperId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '試卷ID',
.....
PRIMARY KEY (`id`),
KEY `index_name` (`courseId`,`userId`,`paperId`) USING BTREE,
KEY `index_id_userId` (`id`,`userId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=494 DEFAULT CHARSET=utf8 COMMENT='用戶做試卷表';
key 是數據庫的物理結構,它包含兩層意義和作用,
一是約束(偏重於約束和規範數據庫的結構完整性),
二是索引(輔助查詢用的)包括primary key (主鍵)、unique key(唯一鍵)、foreign key(外鍵) 等
primary key 有兩個作用,一是約束作用(constraint),用來規範一個存儲主鍵和唯一性,但同時也在此key上建立了一個主鍵索引;
主鍵必須包含唯一的值;
主鍵列不能包含 NULL 值;如果列爲NULL,在增加primary ke時,列自動更改爲NOT NULL
一個表只能有一個primary key,但可以有多個unique key (primary ke 擁有自動定義的 unique約束)
unique約束:唯一標識數據庫表中的每條記錄。
unique 和 primary key 約束均爲列或列集合提供了唯一性的保證。
但每個表可以有多個 unique 約束,但是每個表只能有一個primary key約束
foreign key 也有兩個作用,一是約束作用(constraint),規範數據的引用完整性,但同時也在這個key上建立了一個index
【索引用處】:
快速找出匹配一個WHERE子句的行;
當執行聯結時,從其他表檢索行;
對特定的索引列找出MAX()或MIN()值;
如果排序或分組在一個可用鍵的最左面前綴上進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。
如果所有鍵值部分跟隨DESC,鍵以倒序被讀取。
在一些情況中,一個查詢能被優化來檢索值,不用諮詢數據文件。
如果對某些表的所有使用的列是數字型的並且構成某些鍵的最左面前綴,爲了更快,值可以從索引樹被檢索出來。
而index是數據庫的物理結構,它只是輔助查詢的,它創建時會在另外的表空間(mysql中的innodb表空間)以一個類似目錄的結構存儲。索引要分類的話,分爲前綴索引、全文本索引等;
因此,索引只是索引,它不會去約束索引的字段的行爲(那是key要做的事情)