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