所有MySQL列类型都可以被索引,对相关列使用索引是ᨀ高SELECT操作性能的最佳途
径。根据存储引擎可以定义每个表的最大索引数和最大索引长度,MyISAM和InnoDB 存储引擎的表默认创建的都是BTREE索引,支持前缀索引,即对索引字段的前N个字符创建索引。MyISAM存储引擎支持FULLTEXT索引,并且只限于CHAR、VARCHAR和TEXT列,默认情况下,MEMORY存储引擎使用HASH索引,但也支持BTREE索引。
创建索引有3种方式,第一种是建表的时候确定,比如:
CREATE TABLE lx_test.address
(
address_id
smallint(5) unsigned NOT NULL AUTO_INCREMENT,
address
varchar(50) NOT NULL,
address2
varchar(50) DEFAULT NULL,
district
varchar(20) NOT NULL,
city_id
smallint(5) unsigned NOT NULL,
postal_code
varchar(10) DEFAULT NULL,
phone
varchar(20) NOT NULL,
last_update
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (address_id
),
KEY idx_city_id
(city_id
),
UNIQUE idx_postal_code
(postal_code
),
INDEX idx_phone
(phone
)
) ENGINE=InnoDB AUTO_INCREMENT=606 DEFAULT CHARSET=utf8
这里用了4个关键字index,key,primary key, unique,看看分别什么效果,首先是primary key:
可看到这里的primary key自动建立了一个名字为PRIMARY的索引,由于表引擎是InnoDB,所以索引类型为B树索引,并且增加了唯一性约束。
那么UNIQUE关键字就是创建了增加了唯一性约束的索引,KEY关键字和INDEX关键字在建表时使用则是一个效果。可见,index, key, primary key, unique,都表示索引,只是primary key表示主键索引(固定索引名,unique, 主键唯一性约束),unique表示增加了unique的索引,而index和key的语义相同。
除了在建表时创建索引外,还可以通过修改表语法来创建索引:
ALTER TABLE lx_test.address ADD KEY idx_address2 (address2);
语法和创建表时一样。
还有一种写法:
create INDEX idx_district on lx_test.address (district);
不过这种写法不支持unique和key关键字。
删除索引,使用drop关键字即可。