1、建立索引
索引的建立可以在CREATE TABLE語句中進行,也可以單獨用CREATE INDEX或ALTER TABLE來給表增加索引。以下命令語句分別展示瞭如何建立主鍵索引(PRIMARY KEY),聯合索引(UNIQUE)和普通索引(INDEX)的方法。
mysql>ALTER TABLE 表名 ADD INDEX 索引名 列名; mysql>ALTER TABLE 表名 ADD UNIQUE 索引名 列名; mysql>ALTER TABLE 表名 ADD PRIMARY KEY 索引名 列名; mysql>CREATE INDEX 索引名 ON 表名 列名; mysql>CREATE UNIQUE INDEX 索引名 ON 表名 列名;
例如: mysql>ALTER TABLE `article` ADD INDEX `id`; //給article表增加id索引 或者: mysql>ALTER TABLE `article` ADD INDEX (`id`,`order_id`); //給article表增加id索引,order_id索引
2、重建索引
重建索引在常規的資料庫維護操作中經常使用。在資料庫執行了較長時間後,索引都有損壞的可能,這時就需要重建。對資料重建索引可以起到提高檢索效率。
mysql> REPAIR TABLE 表名 QUICK;
3、查詢資料表索引
MySQL查詢表索引命令的有兩種命令形式:
mysql> SHOW INDEX FROM 表名; 或者: mysql> SHOW keys FROM 表名;
比如:
mysql> SHOW INDEX FROM uc_member; +-----------+------------+---------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-----------+------------+---------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ | uc_member | 0 | PRIMARY | 1 | member_id | A | 1099 | NULL | NULL | | BTREE | | | uc_member | 1 | idx_nickname_passwd | 1 | member_nickname | A | 549 | NULL | NULL | | BTREE | | | uc_member | 1 | idx_nickname_passwd | 2 | member_password | A | 1099 | NULL | NULL | | BTREE | | | uc_member | 1 | member_mobile | 1 | member_mobile | A | 1099 | NULL | NULL | | BTREE | | +-----------+------------+---------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+ 4 rows in set (0.00 sec)
解釋:
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)。
4、刪除索引
刪除索引可以使用ALTER TABLE或DROP INDEX語句來實現。
DROP INDEX可以在ALTER TABLE內部作為一條語句處理,其格式如下:
mysql>DROP index 索引名 ON 表名 列名; mysql>ALTER TABLE 表名 DROP INDEX 索引名 列名; mysql>ALTER TABLE 表名 DROP UNIQUE 索引名 列名; mysql>ALTER TABLE 表名 DROP PRIMARY KEY 索引名 列名;
在上面前三條語句中,都刪除了table_name中的索引index_name。
而在最後一條語句中,只在刪除PRIMARY KEY索引中使用,因為一個表只可能有一個PRIMARY KEY索引,因此也可不指定索引名。
如果沒有建立PRIMARY KEY索引,但表具有一個或多個UNIQUE索引,則MySQL將刪除第一個UNIQUE索引。
如果從表中刪除某列,則索引會受影響。對於多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。
如果刪除組成索引的所有列,則整個索引將被刪除。
---------------------------------------索引、主鍵、唯一索引、聯合索引梳理--------------------------------------------
說下Mysql索引概念:
索引就好比一本書的目錄,它會讓你更快的找到內容,顯然目錄(索引)並不是越多越好,假如這本書1000頁,有500也是目錄,它當然效率低,目錄是要佔紙張的,而索引是要佔磁碟空間的。
Mysql索引主要有兩種結構:hash和B+樹:
hash:hsah索引在mysql比較少用,他以把資料的索引以hash形式組織起來,因此當查詢某一條記錄的時候,速度非常快.當時因為是hash結構,每個鍵只對應一個值,而且是雜湊的方式分佈.所以他並不支援範圍查詢和排序等功能.
B+樹:b+tree是mysql使用最頻繁的一個索引資料結構,資料結構以平衡樹的形式來組織,因為是樹型結構,所以更適合用來處理排序,範圍查詢等功能.相對hash索引,B+樹在查詢單條記錄的速度雖然比不上hash索引,但是因為更適合排序等操作,所以他更受使用者的歡迎.畢竟不可能只對資料庫進行單條記錄的操作.
Mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引
PRIMARY KEY(主鍵索引): ALTER TABLE 表名 ADD PRIMARY KEY 列名 UNIQUE(唯一索引): ALTER TABLE 表名 ADD UNIQUE 列名 INDEX(普通索引): ALTER TABLE 表名 ADD INDEX 索引名 列名 FULLTEXT(全文索引): ALTER TABLE 表名 ADD FULLTEXT 列名 組合索引:ALTER TABLE 表名 ADD INDEX 索引名 (列名1,列名2, 列名3)
Mysql各種索引區別:
普通索引:最基本的索引,沒有任何限制
唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
全文索引:僅可用於 MyISAM 表,針對較大的資料,生成全文索引很耗時好空間。
組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左字首“原則。
索引是一種特殊的檔案(InnoDB資料表上的索引是表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對資料的訪問速度。
普通索引允許被索引的資料列包含重複的值。如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該用關鍵字UNIQUE把它定義為一個唯一索引。也就是說,唯一索引可以保證資料記錄的唯一性。
主鍵,是一種特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用於唯一標識一條記錄,使用關鍵字 PRIMARY KEY 來建立。
索引可以覆蓋多個資料列,如像INDEX(columnA, columnB)索引,這就是聯合索引。
主鍵分為複合主鍵和聯合主鍵
複合主鍵就是指你表的主鍵含有一個以上的欄位組成 。
例如:
create table test ( name varchar(19), id number, value varchar(10), primary key (id,name) )
上面的id和name欄位組合起來就是你test表的複合主鍵 (若其一為單索引欄位時,左邊的id才會有索引)
它的出現是因為你的name欄位可能會出現重名,所以要加上ID欄位這樣就可以保證你記錄的唯一性
一般情況下,主鍵的欄位長度和欄位數目要越少越好。
聯合主鍵,顧名思義就是多個主鍵聯合形成一個主鍵組合,體現在聯合。
(主鍵原則上是唯一的,別被唯一值所困擾。)
索引可以極大的提高資料的查詢速度,但是會降低插入、刪除、更新表的速度,因為在執行這些寫操作時,還要操作索引檔案。
舉一個簡單的例子
主鍵A跟主鍵B組成聯合主鍵
主鍵A跟主鍵B的資料可以完全相同(困擾吧,沒關係),聯合就在於主鍵A跟主鍵B形成的聯合主鍵是唯一的。
下例主鍵A資料是1,主鍵B資料也是1,聯合主鍵其實是11,這個11是唯一值,絕對不充許再出現11這個唯一值。(這就是多對多關係)
主鍵A資料 主鍵B資料
1 1
2 2
3 3
主鍵A與主鍵B的聯合主鍵值最多也就是
11
12
13
21
22
23
31
32
33