MYSQL入門學習之九:索引的簡單操作
相關鏈接:
MYSQL入門學習之一:基本操作
http://www.BkJia.com/database/201212/173868.html
MYSQL入門學習之二:使用正則表達式搜索
http://www.BkJia.com/database/201212/173869.html
MYSQL入門學習之三:全文本搜索
http://www.BkJia.com/database/201212/173873.html
MYSQL入門學習之四:MYSQL的數據類型
http://www.BkJia.com/database/201212/175536.html
MYSQL入門學習之五:MYSQL的字符集
http://www.BkJia.com/database/201212/175541.html
MYSQL入門學習之六:MYSQL的運算符
http://www.BkJia.com/database/201212/175862.html
MYSQL入門學習之七:MYSQL常用函數
http://www.BkJia.com/database/201212/175864.html
MYSQL入門學習之八:數據庫及表的基本操作
http://www.BkJia.com/database/201212/175867.html
一、創建索引 www.2cto.com
MYSQL常用的索引類型主要有以下幾種:
1、普通索引
CREATE INDEX idx_name ON table_name(table_col(length));
如果索引字段是CHAR,varchar類型,length可以指定小於字段實際長度;如果是BLOB和TEXT類型,必須指定length。
mysql> create index idx_name on user(name(10));
mysql> show index from user;
+-------+------------+----------+--------------+-------------+-----------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
+-------+------------+----------+--------------+-------------+-----------+
| user | 1 | idx_name | 1 | name | A |
+-------+------------+----------+--------------+-------------+-----------+
2、唯一索引
CREATE UNIQUE INDEX idx_name ON table_name(table_col(length));
它與普通索引類似,但不同的是,其索引列的值必須唯一,但允許有空值。
mysql> create unique index idx_cn_name_u on user(cn_name(20));
mysql> show index from user;
+-------+------------+---------------+--------------+-------------+-----------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
+-------+------------+---------------+--------------+-------------+-----------+
| user | 0 | idx_cn_name_u | 1 | cn_name | A |
| user | 1 | idx_name | 1 | name | A |
+-------+------------+---------------+--------------+-------------+-----------+
3、主鍵索引
ALTER TABLE table_name ADD PRIMARY KEY (table_col);
它是一種特殊的唯一索引,且不允許有空值。一個表只能有一個主鍵索引。
mysql> alter table user add primary key (id);
mysql> show index from user;
+-------+------------+---------------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+-------+------------+---------------+--------------+-------------+
| user | 0 | PRIMARY | 1 | id |
| user | 0 | idx_cn_name_u | 1 | cn_name |
| user | 1 | idx_name | 1 | name |
+-------+------------+---------------+--------------+-------------+
4、組合索引
CREATE INDEX idx_name ON table_name(table_col_1,table_col_2,...,table_col_n);
它允許使用多個列作為索引列。
mysql> create index idx_name_sex on user(name,sex);
mysql> show index from user;
+-------+------------+---------------+--------------+-------------+-----------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
+-------+------------+---------------+--------------+-------------+-----------+-
| user | 0 | PRIMARY | 1 | id | A |
| user | 0 | idx_cn_name_u | 1 | cn_name | A |
| user | 1 | idx_name | 1 | name | A |
| user | 1 | idx_name_sex | 1 | name | A |
| user | 1 | idx_name_sex | 2 | sex | A |
+-------+------------+---------------+--------------+-------------+-----------+- www.2cto.com
二、刪除索引
DROP INDEX idx_name on table_name;
ALTER TABLE table_name DROP INDEX idx_name;
ALTER TABLE table_name DROP PRIMARY KEY;
mysql> alter table user drop primary key;
mysql> show keys from user;
+-------+------------+---------------+--------------+-------------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+-------+------------+---------------+--------------+-------------+-
| user | 0 | idx_cn_name_u | 1 | cn_name |
| user | 1 | idx_name | 1 | name |
| user | 1 | idx_name_sex | 1 | name |
| user | 1 | idx_name_sex | 2 | sex |
+-------+------------+---------------+--------------+-------------+-
三、查看索引
SHOW INDEX FROM table_name;
SHOW KEYS FROM table_name;
查看索引語句的一個完全輸出類似如下:
mysql> show keys from user;
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| user | 0 | idx_cn_name_u | 1 | cn_name | A | NULL | 20 | NULL | YES | BTREE | |
| user | 1 | idx_name | 1 | name | A | NULL | 10 | NULL | YES | BTREE | |
| user | 1 | idx_name_sex | 1 | name | A | NULL | NULL | NULL | YES | BTREE | |
| user | 1 | idx_name_sex | 2 | sex | A | NULL | NULL | NULL | YES | BTREE | |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
其中:
Table:表的名稱
Non_unique:如果索引不能包括重復詞,則為0。如果可以,則為1。
Key_name:索引的名稱。
Seq_in_index:索引中的列序列號,從1開始。
Column_name:列名稱。
Collation:列以什麼方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。
Cardinality:索引中唯一值的數目的估計值。通過運行ANALYZE TABLE或myisamchk -a可以更新。基數根據被存儲為整數的統計數據來計數,所以即使對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL使用該索引的機會就越大。
Sub_part:如果列只是被部分地編入索引,則為被編入索引的字符的數目。如果整列被編入索引,則為NULL。
Packed:指示關鍵字如何被壓縮。如果沒有被壓縮,則為NULL。
Null:如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
Index_type:使用的索引類型(BTREE, FULLTEXT, HASH, RTREE)。
Comment:索引說明。
四、使用索引的注意事項
1、索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那麼這一列對於此復合索引就是無效的。所以在數據庫設計時盡量不要讓字段的默認值為NULL。
2、使用短索引
對列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
3、不要在列上進行運算
在列上進行運算,將導致索引失效而進行全表掃描。
4、不使用NOT和<>操作
5、索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此數據庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。