前言
索引可以大大提高MySQL的检索速度,本文将详细讲解几种不同的索引类型,及索引常用的数据结构B-树。
正文
1、常见索引类型
1.1 普通索引
普通索引仅加速查询,
CREATE INDEX index_name ON table_name(column_name);
1.2 唯一索引
与普通索引类似,不同的是:索引的列值必须是唯一的,但允许有空值。如果是组合索引,则列值的组合必须唯一。
CREATE UNIQUE INDEX index_name ON table_name(column_name);
1.3 主键索引
主键索引是一种特殊的唯一索引,一张表只能有一个主键,不允许有空值。一般在建表时指定主键,就会自动创建主键索引。
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) NOT NULL ,
PRIMARY KEY (`id`)
);
1.4 组合索引
也叫多列索引、联合索引。指在多个字段上创建索引,使用组合索引时要遵循最左前缀原则,这个原则我会另开一篇博客来讲。
CREATE INDEX index_name ON table_name(column1, column2);
1.5 全文索引
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值比较。全文索引和其他索引不一样,它更像是一个搜索引擎。实际中如果用到全文索引,会使用到ES等搜索引擎。
CREATE FULLTEXT INDEX index_name ON table_name(column_name)
总结
虽然索引可以提高查询速度,但是却会降低表更新的速度(增删改),因为在更新表时,不仅要更新数据,还要更新索引文件。
索引设计和使用原则:
1、需要加索引的字段,要在where条件中;
2、数据量少的字段不需要加索引,因为建索引有一定的开销,如果数据量小则没必要建索引(速度反而慢)
3、选择使用唯一索引,顾名思义,唯一索引的列值是唯一的,可以更快速的确定某条记录,例如学生表的学号就适合使用唯一索引,而学生的性别则不合适使用。
4、使用短索引,对列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果再前10个或20个字符内,多数的值是唯一的,那么就不要对整个列进行索引,短索引不仅可以提高查询速度,还可以节省磁盘空间和IO操作。
5、联合索引相比每个列分别建索引更有优势,因为索引建的越多就越占磁盘空间,在更新数据的时候速度会更慢。