Mysql中索引的 建立,查看,刪除,修改

1,MySQL建立索引

MySQL建立索引的語法以下:
     CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
  [USING index_type]
  ON table_name (index_col_name,...)

其中對應的語法變量信息以下:

[UNIQUE|FULLTEXT|SPATIAL]
中括號中的這三個關鍵字表示建立的索引類型,它們分別表示惟一索引、全文索引、空間索引三種不一樣的索引類型。若是咱們不指定任何關鍵字,則默認爲普通索引。
index_name
index_name表示索引的名稱,由用戶自行定義,以便於之後對該索引進行修改等管理操做。
index_type
index_type表示索引的具體實現方式,在MySQL中,有兩種不一樣形式的索引——BTREE索引和HASH索引。在存儲引擎爲MyISAM和InnoDB的表中只能使用BTREE,其默認值就是BTREE;在存儲引擎爲MEMORY或者HEAP的表中可使用HASH和BTREE兩種類型的索引,其默認值爲HASH。
index_col_name
index_col_name表示須要建立索引的字段名稱,咱們還能夠針對多個字段建立複合索引,只須要在多個字段名稱之間以英文逗號隔開便可。
此外,對於CHAR或VARCHAR類型的字段,咱們還能夠只使用字段內容前面的一部分來建立索引,只須要在對應的字段名稱後面加上形如(length)的指令便可,表示只須要使用字段內容前面的length個字符來建立索引。在這裏,咱們以User表的username字段(類型爲VARCHAR(50))爲例,使用username字段的6個字符前綴來建立索引。
CREATE INDEX idx_user_username ON user (username(6));mysql

因爲多數字段的前6個字符一般不一樣,因此此索引不會比使用字段的所有內容建立的索引速度慢不少。另外,使用字段的一部分建立索引可使索引文件大大減少,從而節省了大量的磁盤空間,有可能提升INSERT操做的速度。sql

在MySQL中,前綴長度最大值爲255字節。對於存儲引擎爲MyISAM或InnoDB的數據表,前綴最長爲1000字節。數據庫

必須注意的是,在MySQL中,對於TEXT和BLOB這種大數據類型的字段,必須給出前綴長度(length)才能成功建立索引。性能優化

備註1:上述建立索引的語法還具備如下變體:ide

ALTER TABLE table_name
ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name (index_col_name,...)
[USING index_type]工具

備註2:在MySQL中,只有當數據表的存儲引擎爲MyISAM, InnoDB或BDB類型時,你才能向具備NULL值的列或者數據類型爲TEXT或BLOB的列添加索引。性能

2,刪除索引

在MySQL中刪除索引的方法很是簡單,其完整語法以下:大數據

--刪除指定表中指定名稱的索引
ALTER TABLE table_name
DROP INDEX index_name;
或者
DROP INDEX index_name on table_name;
在這裏,咱們編寫SQL語句將上面建立索引的例子中的索引idx_user_username刪除掉,代碼詳情以下:優化

--刪除名稱爲idx_user_username的索引
ALTER TABLE user
DROP INDEX idx_user_username;.net

3,修改索引

在MySQL中並無提供修改索引的直接指令,通常狀況下,咱們須要先刪除掉原索引,再根據須要建立一個同名的索引,從而變相地實現修改索引操做。

--先刪除
ALTER TABLE user
DROP INDEX idx_user_username;
--再以修改後的內容建立同名索引
CREATE INDEX idx_user_username ON user (username(8));

4,查看索引

在MySQL中,要查看某個數據庫表中的索引也很是簡單,只須要使用如下兩個命令中的任意一種便可。

--若是查看索引前,沒有使用user db_name等命令指定具體的數據庫,則必須加上FROM db_name
SHOW INDEX FROM table_name [FROM db_name]
--若是查看索引前,沒有使用user db_name等命令指定具體的數據庫,則必須加上db_name.前綴
SHOW INDEX FROM [db_name.]table_name
或者使用以下語句
SHOW KEYS FROM table_name;

5,建立表的時候直接建立索引

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length))

);

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

UNIQUE [indexName] (username(length))

);

6,補充關於MySQL千萬級別數據批量插入優化方法

第一步:配置my.cnf文件

文件中配置

bulk_insert_buffer_size=120M 或者更大

將insert語句的長度設爲最大。

Max_allowed_packet=100M

Net_buffer_length=8k

保存

第二步:查看設置的參選有沒有生效.

Mysql> SHOW VARIABLES;

第三步:完成設置後,批量插入數據時使用多條模式。

INSERT INTO table (field1,field2,field3) VALUES ('a',"b","c"), ('a',"b","c"),('a',"b","c");

7,MySQL性能優化工具

經常使用到命令有explain,profile,processlist等等。
當咱們要對某一條sql的性能進行分析時,可使用它。
Profiling是從 mysql5.0.3版本之後纔開放的。
啓動profile以後,全部查詢包括錯誤的語句都會記錄在內。
關閉會話或者set profiling=0 就關閉了。(若是將profiling_history_size參數設置爲0,一樣具備關閉MySQL的profiling效果。)
此工具可用來查詢SQL執行狀態,System lock和Table lock 花多少時間等等,
對定位一條語句的I/O消耗和CPU消耗 很是重要。(SQL 語句執行所消耗的最大兩部分資源就是IO和CPU)
--在mysql5.7以後,profile信息將逐漸被廢棄,mysql推薦使用performance schema

簡易流程大概以下:

set profiling=1; //打開分析

run your sql1; //運行sql語句

run your sql2;

show profiles; //查看sql1,sql2的語句分析

show profile for query 1; //查看sql1的具體分析

show profile ALL for query 1; //查看sql1相關的全部分析【主要看i/o與cpu,下邊分析中有各項意義介紹】

set profiling=0; //關閉分析

8,參考內容

https://blog.csdn.net/renjianqin_1984/article/details/86072933
http://www.javashuo.com/article/p-ducuhxvd-ca.html

相關文章
相關標籤/搜索