一、 什么是索引
索引是对数据库表中的一列或多列的值进行排序的一种数据结构。
索引的作用就类似于书本的目录,新华字典的拼音,偏旁部首的首查字,可以快速的检索到需要的内容,mysql在300万条记录性能就下降了,虽然mysql官方文档说达500万~800万,所以当数据达到几百万的时候,那么索引就很有必要了。
当表中有大量记录的时候,若要对表进行查询,第一种就是就需要把表中的记录全部取出来,在和查询条件一一对比,然后返回满足条件的记录、这样做就会大大消耗数据库系统的时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到 符合查询条件的索引值,最后通过保存在索引中ROWID(相当于页码)快速找到表中的记录。
二、 SQL语句
- 创建表时创建索引
CREATE TABLE table_name[filed_name data type]
[unique|fulltext][index|key][index_name](filed_name[length])[asc|desc]
语句说明:
unique|fulltext为可选参数,分别表示唯一索引、全文索引
index和key为同义词,两者作用相同,用来指定创建索引
filed_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择
index_name指定索引的名称,为可选参数,如果不指定,默认filed_name为索引值
length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
asc或desc指定升序或降序的索引值存储
- 直接创建索引
CREATE [unique|fulltext][index|key][index_name] ON table (filed_name[length]) - 修改表结构的方式添加索引
ALTER TABLE table_name ADD[unique|fulltext][index|key][index_name] ON (filed_name[length]) - 删除索引
DROP INDEX index_name ON table_name
三、 索引的分类
Index:普通索引,数据可以重复
Fulltext:全文索引,用来对大表的文本域(char,varchar,text)进行索引
注意:全文索引只有MyISAM支持,不过在mysql5.6后Innodb也支持了
Unique:唯一索引,要求所有记录都唯一
primary key:主键索引,也就是在唯一索引的基础上相应的列必须为主键
四、 索引的方式
对于BTREE和HASH索引,当使用=、<=>、IN、IS NULL或者IS NOT NULL操作符时,关键元素与常量值的比较关系对应一个范围条件。Hash索引还有一些其它特征:它们只用于使用=或<=>操作符的等式比较(但很快)。优化器不能使用hash索引来加速ORDER BY操作。(该类索引不能用来按顺序搜索下一个条目)。MySQL不能确定在两个值之间大约有多少行(这被范围优化器用来确定使用哪个索引)。如果你将一个MyISAM表改为hash-索引的MEMORY表,会影响一些查询。只能使用整个关键字来搜索一行。(用BTREE索引,任何关键字的最左面的前缀可用来找到行)。
对于BTREE索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者LIKE ‘pattern’(其中 ‘pattern’不以通配符开始)操作符时,关键元素与常量值的比较关系对应一个范围条件。
“常量值”系指:查询字符串中的常量、同一联接中的const或system表中的列、无关联子查询的结果、完全从前面类型的子表达式组成的表达式。
五、 建立原则
1. 在经常用作过滤器的字段上建立索引;
2. 在SQL语句中经常进行GROUP BY、ORDER BY的字段上建立索引;
3. 在不同值较少的字段上不必要建立索引,如性别字段;
4. 对于经常存取的列避免建立索引;
5. 用于联接的列(主健/外健)上建立索引;
6. 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定;
六、 索引的缺点
- 虽然索引大大的提升了查询的速度,同时也降低了对表的增删改的速度,因为更新表,不仅要保存数据,还要保存索引文件
- 建立索引会占用磁盘空间。一般不太严重,如果你在一个大表上创建多种组合索引,索引文件会增长很快索引只是提高效率的一个因素,如果有大数据量的表,就要花时间研究建立最优秀的索引,或优化查询语句