使用MySQL創建和刪除索引——MySQL 5.7數據庫

以下內容均經過我的親自實踐,其真實有效,希望能給您有所幫助😘😘

在MySQL數據庫中,索引(Index)是影響數據性能的重要因素之一,當我們想要顯著提高數據信息的查詢速度和應用程序的性能時,就需要設計高效的、合理的索引。

一、索引

在創建索引之前,我們先來了解一下索引
1.索引是依賴於表建立的,提供了數據庫中編排表中數據的內部方法。表的存儲由兩部分組成,一部分是表的數據頁面,另一部分是索引頁面。索引就存放在索引頁面上。

2.數據庫中的索引的形式與圖書的目錄相似,鍵值就像目錄中的標題,指針相當於頁碼。索引的功能就像圖書目錄能爲讀者提供快速查找圖書頁面內容一樣,不必掃描整個數據表而找到想要的數據行。

3.索引一旦創建,將由數據庫自動管理和維護。例如,向表中插入、更新和刪除一條記錄時,數據庫會自動在索引中做出相應的修改。在編寫SQL查詢語句時,具有索引的表與不具有索引的表沒有任何區別,索引只是提供一種快速訪問指定記錄的方法。實際過程中,當MySQL執行查詢時,查詢優化器會對可用的多種數據檢索方法的成本進行估計,從中選用最有效的查詢計劃。

4.在數據庫中使用索引的優點如下。
(1)加速數據檢索:索引能夠以一列或多列值爲基礎實現快速查找數據行。
(2)優化查詢:查詢優化器是依賴於索引起作用的,索引能夠加速連接、排序和分組等操作。
(3)強制實施行的唯一性:通過給列創建唯一索引,可以保證表中的數據不重複。
需要注意的是,索引並不是越多越好,要正確認識索引的重要性和設計原則,創建合適的索引。

😀何雲輝 CSDN

二、索引的分類

1.普通索引(index)。

索引的關鍵字是index。普通索引是MySQL中的基本索引類型,允許在定義索引的列中插入重複值和空值。

2.主鍵索引(primary key)。

是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引。也可通過修改表的方法增加主鍵,但一個表只能有一個主鍵索引。

3.唯一性索引(unique)。

unique索引列的值必須唯一,允許有空值。如果是組合索引,則列值的組合必須唯一。在一個表上可以創建多個unique索引。

4.全文索引(fulltext)。

全文索引是指在定義索引的列上支持值的全文查找,允許在這些索引列中插入重複值和空值。該索引只能對charvarchar和text類型的列編制索引,並且只能在MyISAM表中編制。即MySQL中只有MyISAM存儲引擎支持全文索引。在MySQL默認情況下,對於中文作用不大。

5.空間索引(spatial)。

空間索引是對空間數據類型的字段建立的索引。MySQL中的空間數據類型有4種,分別是geometrypointlinestringpolygon。MySQL使用spatil關鍵字進行擴展,使得能夠用於創建正規索引類似的語法創建空間索引。創建空間索引的列,必須將其聲明爲not null,空間索引只有在存儲引擎MyISAM的表中創建。對於初學者來說,這類索引很少會用到。

三、設置索引的原則

在數據表中創建索引,爲使索引的使用效率更高,必須考慮在哪些字段上創建索引和創建什麼類型的索引。首先要了解以下常用的基本原則。

(1)一個表創建大量索引,會影響insert、update和delete語句的性能。應避免對經常更新的表創建過多的索引,要限制索引的數目。
(2)若表的數據量大,對錶數據的更新較少而查詢較多,可以創建多個索引來提高性能。在包含大量重複值的列上創建索引,查詢的時間會較長。
(3)經常需要排序、分組和聯合操作的字段一定要建立索引,即將用於join、 where判斷和order by排序的字段上創建索引。
(4)在視圖上創建索引可以顯著的提升查詢性能。
(5)儘量不要對數據庫中某個含有大量重複的值的字段建立索引,在這樣的字段上建立索引有可能降低數據庫的性能。
(6)在主鍵上創建索引,在InnoDB中如果通過主鍵來訪問數據效率是非常高的。每個表只能創建一個主鍵索引。
(7)要限制索引的數目,對於不再使用或者很少使用的索引要及時刪除。
(8)InnoDB數據引擎的索引鍵最長支持是767字節,MYISAM數據引擎支持1000字節。

😀何雲輝 CSDN

四、創建索引

創建索引通常有3種命令方式,即創建表時附帶創建索引通過修改表來創建索引使用alter table語句來創建索引

1.利用create index語句創建3種索引。如果基表已經創建完畢,就可以使用create index語句建立索引。

創建索引基本形式如下。

create [unique|fulltext|spatial] index index_name 
on table_name (index_col_name,...) 
創建索引時,可以使用col_name(length)語法對前綴編制索引。前綴包括每列值的前length個字符。對於char和varchar列,只用1列的一部分就可創建索引。blob和text列也可以編制索引,但是必須給出前綴長度。
因爲多數名稱的前10個字符通常不同,所以前綴索引不會比使用列的全名創建的索引速度慢很多。另外,使用列的一部分創建索引可以使索引文件大大減小,從而節省了大量的磁盤空間,有可能提高insert操作的速度。

下面是實際操作:

(1)隨機索引

爲便於按電話進行查詢,爲student表的phone列上建立一個升序普通索引phone_index。

mysql> use teaching;
mysql> create index phone_index on student(phone asc);

在這裏插入圖片描述

(2)唯一性索引

在course表的cname列上建立一個唯一性索引cname_index。

mysql> create unique index cname_index on course (cname);

在這裏插入圖片描述

(3)複合索引

在score表的studentno和courseno列上建立一個複合索引sc_index。

mysql> create index sc_index on score(studentno,courseno);

在這裏插入圖片描述

(4)創建表時創建索引。

創建表時可以直接創建索引,這種方式最簡單、方便。

創建teacher1表的tname字段建立一個唯一性索引tname_index,一個前綴索引dep_index。

mysql> use mysqltest;
mysql> create table if not exists teacher1 (
	->  teacherno  char(6) not null comment '教師編號',
	->  tname  char(8) not null comment'教師姓名',
	->  major  char(10) not null comment '專業',
	->  prof char(10) not null comment '職稱',
	->  department char(16) not null comment '部門',
	->  primary key (teacherno),
	->  unique index tname_index(tname),
	->  index dep_index(department(5))
	->  );

在這裏插入圖片描述

2.通過alter table語句創建索引。

在teacher1表上建立teacherno主鍵索引(假定未創建主鍵索引),建立tname和prof的複合索引。

mysql> alter table teacher1
	-> add primary key(teacherno),
	-> add index mark(tname, prof);

如果主鍵索引已經創建,則會出現如下信息:

ERROR 1068 (42000): Multiple primary key defined

在這裏插入圖片描述

說明:
(1)只有表的所有者才能給表創建索引。索引的名稱必須符合MySQL的命名規則,且必須是表中唯一的。
(2)主鍵索引必定是唯一的,唯一性索引不一定是主鍵。一張表上只能一個主鍵,但可以有一個或者多個唯一性索引。
(3)當給表創建unique約束時,MySQL會自動創建唯一索引。創建唯一索引時,應保證創建索引的列不包括重複的數據,並且沒有兩個或兩個以上的空值(null)。因爲創建索引時將兩個空值也視爲重複的數據,如果有這種數據,必須先將其刪除,否則索引不能被成功創建。
(4)若要查看錶中已經創建索引的情況,可以使用show index from table_name語句實現。

五、刪除索引

1.利用alter table語句刪除索引的語法格式如下:

alter [ignore] table table_name 
| drop primary key	
| drop index index_name	
| drop foreign key fk_symbol				 

利用alter table語句同樣可以刪除前面表中創建的索引。例如:

mysql> alter table course drop index cname_index; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章