【1】索引 sql
索引,通俗理解,即目錄。數據庫
以前說過,計算機是對現實世界的模擬。目錄應用在數據庫領域,即所謂的索引。ui
目錄的做用顯而易見,因此創建索引能夠大大提升檢索的速度。spa
可是,會下降更新表的速度,如對錶進行INSERT、UPDATE和DELETE。3d
因更新表時,MySQL不只要保存數據,還要保存一下索引文件。code
創建索引會佔用磁盤空間的索引文件。 blog
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。 索引
【2】索引分類ip
Mysql的索引分爲普通索引、惟一索引、主鍵、全文索引。字符串
有的地方分爲單列索引(普通索引、惟一索引、主鍵索引)和組合索引、全文索引。我的認爲太學術性。
(2.1)主鍵(PRIMARY KEY)
場景1:使用AUTO_INCREMENT
# 場景1: # 建立表SQL特色 # 1.sId列被AUTO_INCREMENT修飾 # 2.沒有任何索引 DROP TABLE IF EXISTS students1; CREATE TABLE `students1` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
SQL執行失敗。
提示ERROR:
Incorrect table definition; there can be only one auto column and it must be defined as a key
分析緣由:沒有爲sId列建立索引,即key
場景2:建立表同時建立主鍵
# 場景2: # 建立表SQL特色 # 1.sId列被AUTO_INCREMENT修飾 # 2.建立主鍵 # 3.主鍵列爲sId DROP TABLE IF EXISTS students2; CREATE TABLE `students2` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb
SQL執行成功。
查詢主鍵:
# 查詢表索引 SHOW INDEX FROM students2;
結果:
說明:場景2爲建立主鍵的方式之一。
場景3:建立表不添加任何索引
# 場景3: # 建立表SQL特色 # 1.sId列沒有被AUTO_INCREMENT修飾 # 2.沒有任何索引 DROP TABLE IF EXISTS students3; CREATE TABLE `students3` ( `sId` INT(20) UNSIGNED NOT NULL, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
執行成功。
建立主鍵(單列):
# 建立主鍵(單列) ALTER TABLE students3 ADD PRIMARY KEY (sId);
查詢主鍵:
# 查詢主鍵 SHOW INDEX FROM students3;
查詢結果:
刪除主鍵:
# 刪除主鍵 ALTER TABLE students3 DROP PRIMARY KEY;
建立主鍵(多列):
# 建立主鍵(多列) ALTER TABLE students3 ADD PRIMARY KEY (sId, sName);
查詢主鍵:
# 查詢主鍵 SHOW INDEX FROM students3;
查詢結果:
刪除主鍵,方法同上。
若不刪除這個多列主鍵,試圖再添加一個主鍵:
# 建立第二個主鍵索引 ALTER TABLE students3 ADD PRIMARY KEY (sId, sStuId);
執行報錯:
查詢:ALTER TABLE students3 ADD PRIMARY KEY (sId, sStuId) 錯誤代碼: 1068
Multiple PRIMARY KEY defined
多個主鍵定義錯誤!
分析以上三種場景,對主鍵總結:
(a)主鍵列的值必須是惟一的
(b)主鍵列的值不容許爲空
(c)主鍵保證記錄的惟一性
(d)主鍵能夠由多列組成
(e)每張表只容許存在一個主鍵
(2.2)惟一索引
場景1:建立表時建立惟一索引
# 場景1:建表時建立惟一性索引 DROP TABLE IF EXISTS students1; CREATE TABLE `students1` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`), UNIQUE INDEX `idx_name` (`sName`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查詢表索引 SHOW INDEX FROM students1;
查詢惟一索引結果:
提示:此爲建立惟一索引方式之一
場景2:建立表時未建立惟一索引
若是建立表時,忘記建立惟一索引,那麼能夠經過兩種方式添加:
建立惟一索引方式二:
# 建立惟一索引(單列) CREATE UNIQUE INDEX uidx_name ON students2 (sName); # 查詢惟一索引(單列) SHOW INDEX FROM students2; # 刪除惟一索引(單列) DROP INDEX uidx_name ON students2; # 查詢惟一索引(單列) SHOW INDEX FROM students2;
查詢惟一索引結果:
建立惟一索引方式三:
# 建立惟一索引(單列) ALTER TABLE students2 ADD UNIQUE INDEX uidx_name (sName); # 查詢惟一索引(單列) SHOW INDEX FROM students2; # 刪除惟一索引(單列) ALTER TABLE students2 DROP INDEX uidx_name; # 查詢惟一索引(單列) SHOW INDEX FROM students2;
查詢惟一索引結果:
建立多列惟一索引:
# 建立惟一索引(多列) ALTER TABLE students2 ADD UNIQUE INDEX uidx_addr_age (sAddr, sAge); # 查詢惟一索引(多列) SHOW INDEX FROM students2; # 刪除惟一索引(多列) ALTER TABLE students2 DROP INDEX uidx_addr_age; # 查詢惟一索引(多列) SHOW INDEX FROM students2;
查詢多列惟一索引結果:
建立多個惟一索引:
# 建立惟一索引(單列) CREATE UNIQUE INDEX uidx_name ON students2 (sName); # 建立惟一索引(多列) ALTER TABLE students2 ADD UNIQUE INDEX uidx_addr_age (sAddr, sAge); # 查詢惟一索引 SHOW INDEX FROM students2; # 刪除索引uidx_name DROP INDEX uidx_name ON students2; # 刪除索引uidx_addr_age DROP INDEX uidx_addr_age ON students2;
查詢惟一索引結果(uidx_name 和 uidx_addr_age兩個惟一索引):
分析以上兩種場景,對惟一索引總結:
(a)惟一索引的目的不是爲了提升訪問速度,而只是爲了不數據出現重複。
(b)索引列的值必須惟一,但容許有NULL。若是惟一索引是組合列索引,則組合列的值必須惟一。
(c)每張表能夠建立多個惟一索引。
(2.3)普通索引
場景1:建立表時建立普通索引
# 場景1:建立表時建立普通索引 DROP TABLE IF EXISTS students1; CREATE TABLE `students1` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`), INDEX `idx_name` (`sName`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查詢普通索引 SHOW INDEX FROM students1;
查詢建立索引:
場景2:建立表時未建立普通索引
# 場景2:建立表時未建立普通索引 DROP TABLE IF EXISTS students2; CREATE TABLE `students2` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
若建立表時未建立普通索引,能夠經過如下兩種方式建立普通索引:
建立普通索引方式二:
# 建立普通索引(單列) CREATE INDEX idx_name ON students2 (sName); # 查詢普通索引(單列) SHOW INDEX FROM students2; # 刪除普通索引(單列) DROP INDEX idx_name ON students2; # 查詢普通索引(單列) SHOW INDEX FROM students2;
查詢建立索引:
建立普通索引方式三:
# 建立普通索引(單列) ALTER TABLE students2 ADD INDEX idx_addr (sAddr); # 查詢普通索引(單列) SHOW INDEX FROM students2; # 刪除普通索引(單列) ALTER TABLE students2 DROP INDEX idx_addr; # 查詢普通索引(單列) SHOW INDEX FROM students2;
查詢建立索引:
建立普通多列索引:
# 建立普通索引(多列) ALTER TABLE students2 ADD INDEX idx_addr_age (sAddr, sAge); # 查詢普通索引(多列) SHOW INDEX FROM students2; # 刪除普通索引(多列) ALTER TABLE students2 DROP INDEX idx_addr_age; # 查詢普通索引(多列) SHOW INDEX FROM students2;
查詢建立索引:
建立多個普通索引:
# 建立多個普通索引 # 建立普通索引(單列) CREATE INDEX idx_name ON students2 (sName); # 建立普通索引(多列) ALTER TABLE students2 ADD INDEX idx_addr_age (sAddr, sAge); # 查詢普通索引 SHOW INDEX FROM students2; # 刪除索引idx_name DROP INDEX idx_name ON students2; # 刪除索引idx_addr_age DROP INDEX idx_addr_age ON students2; # 查詢普通索引 SHOW INDEX FROM students2;
查詢建立索引:
分析以上兩種場景,對普通索引(最基本的索引,沒有任何限制)總結:
(a)索引列的值能夠爲NULL,能夠重複。
(b)每張表能夠建立多個普通索引。
(c)普通索引一樣也能夠建立多列。
(2.4)全文索引
場景1:建立表時建立全文索引
# 場景1:建立表時建立全文索引 DROP TABLE IF EXISTS students1; CREATE TABLE `students1` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`), FULLTEXT ft_name_stuid (sName, sStuId) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查詢表索引 SHOW INDEX FROM students1;
查詢索引結果:
場景2:建立表時未建立全文索引
# 場景2:建立表時未建立全文索引 DROP TABLE IF EXISTS students1; CREATE TABLE `students1` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(10) NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(10) DEFAULT NULL, `sStuId` VARCHAR(20) DEFAULT NULL, `sSex` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查詢表索引 SHOW INDEX FROM students1;
若建立表時未建立索引,能夠經過如下兩種方式建立:
建立全文索引方式二:
# 建立全文索引方式二: # 建立全文索引(多列) CREATE FULLTEXT INDEX ft_name_addr ON students2 (sName, sAddr); # 查詢全文索引(多列) SHOW INDEX FROM students2; # 刪除全文索引(多列) DROP INDEX ft_name_addr ON students2; # 查詢全文索引(多列) SHOW INDEX FROM students2;
查詢全文索引:
建立全文索引方式三:
# 建立全文索引方式三: # 建立全文索引(多列) ALTER TABLE students2 ADD FULLTEXT INDEX ft_name_stuid (sName, sStuId); # 查詢全文索引(多列) SHOW INDEX FROM students2; # 刪除全文索引(多列) ALTER TABLE students2 DROP INDEX ft_name_stuid; # 查詢全文索引(多列) SHOW INDEX FROM students2;
查詢全文索引:
建立多個全文索引:
# 建立多個全文索引 # 建立全文索引(單列) CREATE FULLTEXT INDEX ft_name_stuid ON students2 (sName, sStuId); # 建立全文索引(多列) ALTER TABLE students2 ADD FULLTEXT INDEX ft_addr (sAddr); # 查詢全文索引 SHOW INDEX FROM students2; # 刪除索引ft_name_stuid DROP INDEX ft_name_stuid ON students2; # 刪除索引ft_addr DROP INDEX ft_addr ON students2; # 查詢索引 SHOW INDEX FROM students2;
查詢全文索引:
添加整型字段的全文索引:
ALTER TABLE students2 ADD FULLTEXT INDEX ft_age (sAge);
執行失敗:
查詢:ALTER TABLE students2 ADD FULLTEXT INDEX ft_age (sAge)錯誤代碼: 1283
COLUMN 'sAge' cannot be part of FULLTEXT INDEX
說明:全文索引只可針對字符串類型的字段。
分析以上兩種場景,對全文索引總結:
(a)全文索引只針對字段類型爲字符串的列。
(b)全文索引能夠爲多列建立。
【3】總結
(3.1)增長索引:
// 普通索引 alter table table_name add index index_name (column_list); // 惟一索引 alter table table_name add unique index uindex_name (column_list); // 主鍵索引 alter table table_name add primary key (column_list); // 全文索引 alter table table_name add fulltext index ftindex_name (column_list); // 普通索引 create index index_name on table_name (column_list); // 惟一索引 create unique index index_name on table_name (column_list); // 全文索引 create fulltext index ftindex_name on table_name (column_list);
(3.2)刪除索引:
// 非主鍵索引 drop index index_name on table_name; alter table table_name drop index index_name; // 刪除主鍵 alter table table_name drop primary key;
Good Good Study, Day Day Up.
順序 選擇 循環 總結