Mysql 索引增加與刪除


【1】索引

索引,通俗理解,即目錄。

之前說過,計算機是對現實世界的模擬。目錄應用在數據庫領域,即所謂的索引。

目錄的作用顯而易見,所以建立索引可以大大提高檢索的速度。

但是,會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。

因更新表時,MySQL不僅要保存數據,還要保存一下索引文件。

建立索引會占用磁盤空間的索引文件。

實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。

【2】索引分類

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.

順序 選擇  循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM