mysql操做命令梳理(1)-索引

 

一、建立索引
索引的建立能夠在CREATE TABLE語句中進行,也能夠單獨用CREATE INDEX或ALTER TABLE來給表增長索引。如下命令語句分別展現瞭如何建立主鍵索引(PRIMARY KEY),聯合索引(UNIQUE)和普通索引(INDEX)的方法。mysql

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索引

二、重建索引
重建索引在常規的數據庫維護操做中常用。在數據庫運行了較長時間後,索引都有損壞的可能,這時就須要重建。對數據重建索引能夠起到提升檢索效率。sql

mysql> REPAIR TABLE 表名 QUICK;

三、查詢數據表索引
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)。spa

四、刪除索引
刪除索引可使用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索引。
若是從表中刪除某列,則索引會受影響。對於多列組合的索引,若是刪除其中的某列,則該列也會從索引中刪除。
若是刪除組成索引的全部列,則整個索引將被刪除。blog

---------------------------------------索引、主鍵、惟一索引、聯合索引梳理--------------------------------------------
說下Mysql索引概念:
索引就比如一本書的目錄,它會讓你更快的找到內容,顯然目錄(索引)並非越多越好,假如這本書1000頁,有500也是目錄,它固然效率低,目錄是要佔紙張的,而索引是要佔磁盤空間的。排序

Mysql索引主要有兩種結構:hash和B+樹:
hash:hsah索引在mysql比較少用,他以把數據的索引以hash形式組織起來,所以當查找某一條記錄的時候,速度很是快.當時由於是hash結構,每一個鍵只對應一個值,並且是散列的方式分佈.因此他並不支持範圍查找和排序等功能.
B+樹:b+tree是mysql使用最頻繁的一個索引數據結構,數據結構以平衡樹的形式來組織,由於是樹型結構,因此更適合用來處理排序,範圍查找等功能.相對hash索引,B+樹在查找單條記錄的速度雖然比不上hash索引,可是由於更適合排序等操做,因此他更受用戶的歡迎.畢竟不可能只對數據庫進行單條記錄的操做. 索引

Mysql常見索引有:主鍵索引、惟一索引、普通索引、全文索引、組合索引hash

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

相關文章
相關標籤/搜索