提升SELECT操做性能最好的方法就是在查詢的一列或者多列建立索引。索引就像錶行的指針,容許快速肯定那些行和WHERE語句條件匹配,並檢索這一行的其餘列值,在mysql中全部的數據類型均可以被索引。咱們能夠根據存儲引擎定義每一個表的最大索引數和最大索引長度,每一種索引引擎的每張表至少支持16個索引,索引總長度最少爲256字節。對於MyISAM表總長度能夠達到1000字節,而對於InnoDB表能夠達到767字節。mysql
mysql常見的索引包括 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT四種索引。sql
PRIMARY KEY 索引:mysql在建立主鍵的時候自動會爲主鍵建立索引,而不須要咱們顯式的聲明索引。好比:性能
mysql> create table tPri( -> id INTEGER PRIMARY KEY, -> name VARCHAR(20) -> ); Query OK, 0 rows affected (0.06 sec) mysql> explain select * from tPri where id>=1; +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | tPri | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where | +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 1 row in set (0.01 sec)
上面的explain命令能夠解析sql語句優化sql語句,後續會詳細介紹。使用此命令能夠選擇出一行數據,這裏咱們只關注possible_keys 和key,這兩個字段描述的是索引的類型,能夠看出建立PRIMARY KEY的時候直接建立一條索引。優化
建立其餘索引能夠直接在建立表的時候建立索引,也可使用create [unique|fulltext|spatial] index index_name[using index_type] on table_name(index_col_name,...);其中index_col_name能夠指定長度col_name[(length)] [ASC|DESC];同時咱們也可使用alter table的語法增長索引。spa
UNIQUE:可選。表示索引爲惟一性索引。
FULLTEXT;可選。表示索引爲全文索引。
SPATIAL:可選。表示索引爲空間索引。
INDEX和KEY:用於指定字段爲索引,二者選擇其中之一就能夠了,做用是同樣的。
索引名:可選。給建立的索引取一個新名稱。
字段名1:指定索引對應的字段的名稱,該字段必須是前面定義好的字段。
長度:可選。指索引的長度,必須是字符串類型纔可使用。
ASC:可選。表示升序排列。
DESC:可選。表示降序排列。指針
下面分別是建立索引 的三種狀況。code
1.在 建表的時候直接建立索引。索引
mysql> create table user( -> id INTEGER, -> name VARCHAR(20), -> address VARCHAR(100), -> phone varchar(11), -> index idx_1(id), -> unique index idx_2(name), -> fulltext index idx_3(address) -> ); Query OK, 0 rows affected (0.48 sec)
2.使用alter建立索引字符串
mysql> create table user( -> id INTEGER, -> name VARCHAR(20), -> address VARCHAR(100), -> phone varchar(11) -> ); Query OK, 0 rows affected (0.01 sec) mysql> alter table user add primary key(id); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table user add unique (name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table user add index idx_1 ( phone); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table user add fulltext ( address); Query OK, 0 rows affected, 1 warning (0.24 sec) Records: 0 Duplicates: 0 Warnings: 1
3 使用create建立索引table
mysql> create table user( -> id INTEGER, -> name VARCHAR(20), -> address VARCHAR(100), -> phone varchar(11) -> ); Query OK, 0 rows affected (0.01 sec) mysql> create index idx_1 on user(id); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create unique index idx_2 on user(name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create fulltext index idx_3 on user(address); Query OK, 0 rows affected, 1 warning (0.09 sec) Records: 0 Duplicates: 0 Warnings: 1
刪除索引就比較容易了,直接使用drop便可。
mysql> drop index idx_1 on user; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0