MySql索引(精简)

话不多说奔主题,精神抖擞就是干!

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类型的。

欢迎看官儿们留言补充和指正,谢谢下次见!

原文地址:https://www.cnblogs.com/chenyixun/p/12994980.html