话不多说奔主题,精神抖擞就是干!
1. 建立索引的目的是:为了加快查询速度,因为全表扫描太慢。
2. 有哪些索引可以使用:主键索引、唯一索引、普通索引、组合索引、全文索引。
3. 每个索引的特点是什么?
1). 主键索引:一般用在表id字段上,并且其关联的列的值一般是int自增、唯一、非NULL的。
2). 唯一索引:与主键索引的区别是其关联的列的值可以是NULL的。
3). 普通索引:这个没啥好讲的。
4). 组合索引:一个索引对应多个列(其实数据库也同时自动创建了对应的多个单列索引)。
5). 全文索引:需要添加索引的列的数据比较大(例如:text等),而且一般是要搜索该列数据中的关键字时。
4. 如何创建这些索引?
例如我们有一张表
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', `nickname` varchar(12) NOT NULL DEFAULT '' COMMENT '用户昵称', `account` varchar(12) NOT NULL DEFAULT '' COMMENT '帐号', `password` char(32) NOT NULL DEFAULT '' COMMENT '密码', `message` text NOT NULL DEFAULT '' COMMENT '备注信息', `created_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间', `updated_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
1). 创建唯一索引
CREATE UNIQUE INDEX account_UNIQUE_Index ON `user`(`account`);
或者
ALTER TABLE `user` ADD UNIQUE INDEX account_UNIQUE_Index(`account`);
2). 创建普通索引
CREATE INDEX account_Index ON `user`(`account`);
或者
ALTER TABLE `user` ADD INDEX account_Index(`account`);
3). 创建组合索引
CREATE INDEX nickname_account_createdTime_Index ON `user`(`nickname`, `account`, `created_time`);
或者
ALTER TABLE `user` ADD INDEX nickname_account_createdTime_Index(`nickname`, `account`, `created_time`);
4). 创建全文索引
ALTER TABLE `user` ADD FULLTEXT(message);
使用时
SELECT * FROM `user` WHERE MATCH(message) AGAINST(‘关键字1′, ‘关键字2′, ‘关键字3′...);
5. 那么这些索引什么时候起作用?
1). where后面的列字段上。
2). group by、order by、distinct后面的列字段上。
3). join联表后面的列字段上。
6. 什么时候又会导致索引失效呢?
1). 列运算,添加索引的列如果参与了函数运算。
2). 添加索引的列含有NULL值。
3). like后紧跟'%'。
4). 组合索引未完全匹配最左原则时。
7. 什么样的列不建议创建索引呢?
1). 不经常参与条件匹配的列。
2). 该列的数据是类似枚举型的,则意义不大。
3). 该列的数据类型是text、image、bit类型的。
欢迎看官儿们留言补充和指正,谢谢下次见!