Mysql索引的创建和使用
Mysql索引
- 一、Mysql索引
- 1、Mysql索引的概念
- 2、Mysql索引的作用
- 3、Mysql索引的副作用
- 4、創建索引的原則依據
- 5、索引的分類以及創建
- 6、索引創建的方法
- 6.1、普通索引
- 直接創建索引和查詢索引的方式
- 修改表方式創建
- 創建表的時候指定索引
- 6.2、唯一索引
- 直接創建唯一索引
- 修改表方式創建
- 創建表的時候指定
- 6.3、主鍵索引
- 創建表的時候指定
- 修改表方式創建
- 6.4、組合索引(單列索引與多列索引)
- 6.5、全文索引
- 直接創建索引
- 修改表方式創建
- 創建表的時候指定索引
- 使用全文索引查詢
- 二、查看索引
- 三、刪除索引
- 1、直接刪除索引
- 2、修改表方式刪除索引
- 3、刪除主鍵索引
- 總結
一、Mysql索引
1、Mysql索引的概念
- 1、索引是一個排序的列表,在這個列表中存儲著索引的值和包含這個值的數據所在行的物理地址(類似于c語言的鏈表通過指針指向數據記錄的內存地址)。
- 2、使用索引后可以不用掃描全表來定位某行的數據,而是先通過索引表找到該行數據對應的物理地址然后訪問相應的數據,因此能加快數據庫的查詢速度。
- 3、索引就好比是一本書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
- 4、索引是表中一列或者若干列值排序的方法。
- 5、建立索引的目的是加快對表中記錄的查找或排序。
2、Mysql索引的作用
- 1、設置了合適的索引之后,數據庫利用各種快速定位技術,能夠大大加快查詢速度,這是創建所有的最主要的原因。
- 2、當表很大或查詢涉及到多個表時,使用索引可以成千上萬倍地提高查詢速度。
- 3、可以降低數據庫的IO成本,并且索引還可以降低數據庫的排序成本。
- 4、通過創建唯一性索引,可以保證數據表中每一行數據的唯一性。
- 5、可以加快表與表之間的連接。
- 6、在使用分組和排序時,可大大減少分組和排序的時間。
3、Mysql索引的副作用
- 1、索引需要占用額外的磁盤空間。
- 2、對于 MyISAM 引擎而言,索引文件和數據文件是分離的,索引文件用于保存數據記錄的地址。
而 InnoDB 引擎的表數據文件本身就是索引文件。 - 3、在插入和修改數據時要花費更多的時間,因為索引也要隨之變動。
4、創建索引的原則依據
-
1、索引隨可以提升數據庫查詢的速度,但并不是任何情況下都適合創建索引。因為索引本身會消耗系統資源,在有索引的情況下,數據庫會先進行索引查詢,然后定位到具體的數據行,如果索引使用不當,反而會增加數據庫的負擔。
-
2、表的主鍵、外鍵必須有索引。因為主鍵具有唯一性,外鍵關聯的是子表的主鍵,查詢時可以快速定位。
-
3、記錄數超過300行的表應該有索引。如果沒有索引,需要把表遍歷一遍,會嚴重影響數據庫的性能。
-
4、經常與其他表進行連接的表,在連接字段上應該建立索引。
-
5、唯一性太差的字段不適合建立索引。
-
6、更新太頻繁地字段不適合創建索引。
-
7、經常出現在 where 子句中的字段,特別是大表的字段,應該建立索引。
-
8、索引應該建在選擇性高的字段上。
-
9、索引應該建在小字段上,對于大的文本字段甚至超長字段,不要建索引。
5、索引的分類以及創建
- 普通索引、唯一索引、主鍵索引、組合索引、全文索引
6、索引創建的方法
1、直接創建索引(主鍵索引無法使用此方式) (create index) 2、修改表結構方式添加索引 (alter update) 3、創建表結構時創建索引 (create table)這邊我們先創建一個表,以便后面實驗使用
use school; create table class( id int(10), name varchar(10), cardid varchar(10), phone varchar(18), address varchar(50), remark text);desc class;insert into class values ('1','zhangsan','111111','123123','北京','this is vip'); insert into class values ('2','lisi','222222','234234','上海','this is vip'); insert into class values ('3','wangwu','333333','345345','廣州','this is common'); insert into class values ('4','zhaoliu','444444','456456','南京','this is common');select * from class;
6.1、普通索引
最基礎的索引類型,沒有唯一性之類的限制。
直接創建索引和查詢索引的方式
CREATE INDEX 索引名 ON 表名 (列名[(length)]); #(列名(length)):length是可選項,下同。如果忽略 length 的值,則使用整個列的值作為索引。如果指定使用列前的 length 個字符來創建索引,這樣有利于減小索引文件的大小。 #索引名建議以“_index”結尾。例: create index name_index on class (name); create index address_index on class (address(2));
查詢索引的方式
show create table class; show index from class\G show keys from class;
修改表方式創建
ALTER TABLE 表名 ADD INDEX 索引名 (列名);例: alter table class add index id_index (id); show keys from class\G;
創建表的時候指定索引
CREATE TABLE 表名 ( 字段1 數據類型,字段2 數據類型[,...],INDEX 索引名 (列名));例: create table test( id int(10), name varchar(20), index id_index (id));show keys from test\G;6.2、唯一索引
- 與普通索引類似,但區別是唯一索引列的每個值都唯一。唯一索引允許有空值(注意和主鍵不同)。如果是用組合索引創建,則列值的組合必須唯一。添加唯一鍵將自動創建唯一索引。
直接創建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);例: create unique index address_index on class2(address); create unique index id_index on class2(id);show keys from class2\G;修改表方式創建
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);例: alter table class2 add unique cardid_index (cardid); show keys from class2\G;
創建表的時候指定
CREATE TABLE 表名 (字段1 數據類型,字段2 數據類型[,...],UNIQUE 索引名 (列名));例: create table test2( id int(10), name varchar(20), unique id_index (id));show keys from test2\G;6.3、主鍵索引
- 是一種特殊的唯一索引,必須指定為“PRIMARY KEY”。一個表只能有一個主鍵,不允許有空值。 添加主鍵將自動創建主鍵索引。
創建表的時候指定
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));例: create table test3( id int(10), name varchar(20), primary key (id)); 或 create table test4(id int(10) not null primary key,name varchar(20) not null);show keys from test3\G; show keys from test4\G;修改表方式創建
ALTER TABLE 表名 ADD PRIMARY KEY (列名); 例: alter table class add primary key(id); show keys from class\G;6.4、組合索引(單列索引與多列索引)
- 可以是單列上創建的索引,也可以是在多列上創建的索引。需要滿足最左原則,因為 select 語句的 where 條件是依次從左往右執行的,所以在使用 select 語句查詢時 where 條件使用的字段順序必須和組合索引中的排序一致,否則索引將不會生效。
6.5、全文索引
適合在進行模糊查詢的時候使用,可用于在一篇文章中檢索文本信息。
在 MySQL5.6 版本以前FULLTEXT 索引僅可用于 MyISAM 引擎;
在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。
全文索引可以在 CHAR、VARCHAR 或者 TEXT 類型的列上創建。每個表只允許有一個全文索引。
直接創建索引
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);例: create fulltext index remark_index on class (remark);
修改表方式創建
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);例: alter table class2 add fulltext name_index (name);創建表的時候指定索引
這里個上邊主鍵索引、唯一索引的操作類似這里不做演示
CREATE TABLE 表名 (字段1 數據類型[,...],FULLTEXT 索引名 (列名)); #數據類型可以為 CHAR、VARCHAR 或者 TEXT使用全文索引查詢
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查詢內容');例: select * from class2 where match(remark) against('vip');二、查看索引
show index from 表名; show index from 表名\G show keys from 表名; show keys from 表名\G #---------------查看后個字段的解釋---------------------------------------------------- 各字段的含義如下: Table:表的名稱。 Non_unique:如果索引不能包括重復詞,則為 0;如果可以,則為 1。 Key_name:索引的名稱。 Seq_in_index:索引中的列序號,從 1 開始。 Column_name:列名稱。 Collation:列以什么方式存儲在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(無分類)。 Cardinality:索引中唯一值數目的估計值。 Sub_part:如果列只是被部分地編入索引,則為被編入索引的字符的數目。如果整列被編入索引,則為 NULL。 Packed:指示關鍵字如何被壓縮。如果沒有被壓縮,則為 NULL。 Null:如果列含有 NULL,則含有 YES。如果沒有,則該列含有 NO。 Index_type:用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 Comment:備注。三、刪除索引
1、直接刪除索引
DROP INDEX 索引名 ON 表名; 例: drop index id_index on test;2、修改表方式刪除索引
ALTER TABLE 表名 DROP INDEX 索引名; 例: alter table test2 drop index id_index;3、刪除主鍵索引
ALTER TABLE 表名 DROP PRIMARY KEY;
例:
alter table class2 drop primary key;
總結
一、創建索引的作用
- 設置了合適的索引之后,數據庫利用各種快速定位技術,能夠大大加快查詢速度,這是創建所有的最主要的原因。
- 當表很大或查詢涉及到多個表時,使用索引可以成千上萬倍地提高查詢速度。
- 可以降低數據庫的IO成本,并且索引還可以降低數據庫的排序成本。
- 通過創建唯一性索引,可以保證數據表中每一行數據的唯一性。
- 可以加快表與表之間的連接。
- 在使用分組和排序時,可大大減少分組和排序的時間。
二、索引的副作用
- 索引需要占用額外的磁盤空間。
- 在插入和修改數據時要花費更多的時間,因為索引也要隨之變動。
三、創建索引的原則依據
- 表的主鍵、外鍵必須有索引。因為主鍵具有唯一性,外鍵關聯的是子表的主鍵,查詢時可以快速定位。
- 記錄數超過300行的表應該有索引。如果沒有索引,需要把表遍歷一遍,會嚴重影響數據庫的性能。
- 經常與其他表進行連接的表,在連接字段上應該建立索引。
- 唯一性太差的字段不適合建立索引。
- 更新太頻繁地字段不適合創建索引。
- 經常出現在 where 子句中的字段,特別是大表的字段,應該建立索引。
- 索引應該建在選擇性高的字段上。
- 索引應該建在小字段上,對于大的文本字段甚至超長字段,不要建索引。
三、索引分類
- 普通索引
- 唯一索引
- 主鍵索引
- 組合索引
- 全文索引
四、創建方法(以上索引都可以使用三種方法)
- 直接創建索引(主鍵索引無法使用此方式)
- 修改表結構方式添加索引
- 創建表結構時創建索引
五、刪除索引
- 直接刪除索引(DROP INDEX 索引名 ON 表名;)
- 修改表方式刪除索引(ALTER TABLE 表名 DROP INDEX 索引名;)
- 刪除主鍵索引(ALTER TABLE 表名 DROP PRIMARY KEY;)
六、查看索引
- show index from 表名;
- show index from 表名\G
- show keys from 表名;
- show keys from 表名\G
總結
以上是生活随笔為你收集整理的Mysql索引的创建和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基本操作命令和数据表高级操作
- 下一篇: MySQL事务与存储引擎相关设置