創(chuàng)建索引
- 創(chuàng)建表的時候創(chuàng)建索引
CREATE TABLE table_name [col_name data_type] [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]) [ASC|DESC]
UNIQUE、FULLTEXT和SPATIAL為可選參數(shù),分別表示唯一索引、全文索引和空間索引;INDEX與KEY為同義詞,兩者作用相同,用來指定創(chuàng)建索引;col_name為需要創(chuàng)建索引的字段列,該列必須從數(shù)據(jù)表中定義的多個列中選擇;index_name指定索引的名稱,為可選參數(shù),如果不指定,MySQL默認(rèn)col_name為索引值;length為可選參數(shù),表示索引的長度,只有字符串類型的字段才能指定索引長度;ASC或DESC指定升序或者降序的索引值存儲
- 查看索引
CREATE TABLE `book`(
`bookId` INT NOT NULL,
`bookName` VARCHAR(255) NOT NULL,
`authors` VARCHAR(255) NOT NULL,
`info` VARCHAR(255),
`comment` VARCHAR(255),
`yearPublication` YEAR NOT NULL,
INDEX(yearPublication)
);
創(chuàng)建唯一索引
CREATE TABLE t1(
`id` INT NOT NULL,
`name` CHAR(30) NOT NULL,
UNIQUE INDEX UniqIdx(id)
);
創(chuàng)建單列索引
CREATE TABLE t1(
`id` INT NOT NULL,
`name` CHAR(30) NOT NULL,
INDEX SingleIdx(name(20))
);
創(chuàng)建索引長度為20的單列索引
創(chuàng)建組合索引
CREATE TABLE t3(
`id` INT NOT NULL,
`name` CHAR(20) NOT NULL,
`age` INT NOT NULL,
`info` VARCHAR(255),
INDEX MultiIdx(`id`, `name`, `age`)
);
- 查看表的結(jié)構(gòu)
SHOW CREATE TABLE t3;
CREATE TABLE `t3` (
`id` int(11) NOT NULL,
`name` char(20) NOT NULL,
`age` int(11) NOT NULL,
`info` varchar(255) DEFAULT NULL,
KEY `MultiIdx` (`id`,`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
由結(jié)果可以看出,創(chuàng)建了id、name、age名為MultiIdx的組合索引
組合索引可起到幾個索引的作用,但是使用時并不是隨便查詢哪個字段都可以使用索引,而是要遵循“最左前綴”原則:利用索引中最左邊的列集來匹配行,這樣的列集稱為最左前綴。例如,這里有id、name和age三個字段構(gòu)成的索引,索引行中按照id/name/age的順序存放,索引可以搜索下面的字段組合:(id,name,age),(id,name)或者id。
EXPLANIN語句--查看索引
EXPLAIN SELECT * FROM book WHERE yearPublication=2016;
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | book | ref | yearPublication | yearPublication | 1 | const | 1 |
EXPLANIN語句輸出結(jié)果的各行解釋如下:
(1) select_type: 指定所使用的SELECT查詢類型,這里值為SIMPLE,表示簡單的SELECT,不使用UNION或子查詢。其他可能的取值有PRIMARY、UNION、SUBQUERY等。
(2) table: 指定數(shù)據(jù)庫讀取的數(shù)據(jù)表的名字,它們按被讀取的先后順序排列。
(3) type: 指定本數(shù)據(jù)庫表與其他數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系,可能的取值有system、const、eq_ref、ref、range、index、和all。
(4) possible_keys: 給出MySQL在搜索數(shù)據(jù)記錄時可選用的各個索引。
(5) key: MySQL實(shí)際選用的索引。
(6) key_len: 給出索引按字節(jié)計(jì)算的長度,key_len的數(shù)值越小,表示查詢速度越快
(7) ref: 給出關(guān)聯(lián)關(guān)系中另一個數(shù)據(jù)表里的數(shù)據(jù)列的名字。
(8) rows: MySQL在執(zhí)行這個查詢時預(yù)計(jì)會從這個數(shù)據(jù)表里讀出的數(shù)據(jù)行的個數(shù)。
(9) extra: 提供與關(guān)聯(lián)操作有關(guān)的信息。