MySQL索引

203 阅读3分钟

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

新建测试表

CREATE TABLE `book` (
  `id` int(11) NOT NULL,
  `book_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

1、普通索引

这是最基本的索引,它没有任何限制

CREATE INDEX book_index on book (id)
ALTER TABLE book ADD INDEX book_index(id)

2、唯一索引

与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一

CREATE UNIQUE INDEX book_index_un on book (id)
ALTER TABLE book ADD UNIQUE INDEX book_index_un(id)

3、主键索引

这个一般在创建表的时候都会直接指定

ALTER TABLE book ADD PRIMARY KEY(id)

4、全文索引

ALTER TABLE book ADD FULLTEXT book_index_full (book_name)

5、索引删除

5.1、主键索引删除

ALTER TABLE book drop PRIMARY KEY

5.2、其它类型删除

DROP INDEX book_index on book

6、覆盖索引

参考:www.cnblogs.com/happyflying…

  • 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
  • 解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。
  • 解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
  • 不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引
  • MySQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关;MYISAM和InnoDB存储引擎只支持BTREE索引;MEMORY和HEAP存储引擎可以支持HASH和BTREE索引

  当发起一个被索引覆盖的查询(也叫作索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息

  当只有主键索引时   

EXPLAIN select * from book

建立一个联合所引

CREATE INDEX book_index on book (id, book_name)
EXPLAIN select * from book

7、建立索引的原则

  • 表的主键、外键应该建立索引
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 为经常需要排序、分组和联合操作的字段建立索引
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不建议建索引
  • 频繁进行数据操作的表,不要建立太多的索引
  • 删除无用的索引,避免对执行计划造成负面影响
  • 尽量的扩展索引,不要新建索引