什么是索引
提到索引,大家的第一反应应该想到小时候用到的字典,根据偏旁或者拼音来查找汉字,这就是一个简单的概念了。在计算机中,索引是对数据库表中的一个或多个字段进行排序的一种数据结构。
索引对于查询的效率有着十分重要的作用,特别是对于表非常大的情况下,不合适的索引可能会导致查询性能的急剧下降。大部分MySQL索引 (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT) 是存储在一种叫做B-Tree的数据结构,而某些特殊的数据类型会把索引存储在叫做R-tree的数据结构,如果是MEMORY存储引擎会支持HASH索引。
索引种类
MySQL目前提供了4种索引:
- B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。
- HASH 索引:只有Memory引擎支持,使用场景简单。
- R-Tree 索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型。
- Full-text (全文索引):全文索引也是MyISAM的一种特殊索引类型,主要用于全文索引。
索引的作用
- 索引可以将随机I/O变成顺序I/O。
- 索引可以帮助服务器避免排序和临时表。
- 索引可以减少服务器需要扫描的数据量。
- 索引可以根据where条件快速匹配满足条件的行。
- 如果一个查询有多个索引可以使用时,MySQL自动选择需要查找最少行数的索引。
如果索引太多,应用程序的性能会受到影响;索引太少,对查询的性能又会产生影响,所以要找到一个平衡点。
索引的弊端
解决查询优化不一定需要索引,像查询运行不够快就将WHERE子句中的条件全部放在索引中这种想法是不对的。索引能够极大地提高数据检索效率,也能够改善排序分组操作的性能,但有不能忽略的一个问题就是索引是完全独立于基础数据之外的一部分数据。
当遇到以下情况时,可以考虑不创建索引,可能查询效率还会更高:
- 数据量比较少的表,没必要建索引,让查询做全表扫描即可;比如只有几百条数据。
- 索引的选择性较低。比如性别、状态这种没区分度的字段。
- MySQL只对以下操作符才使用索引:<,<=,=,>,>=,between,in, 以及某些时候的like(不以通配符%或_开头的情形),如果业务查询SQL很少使用以上操作符,可以考虑不建索引。
当我们设计查询语句时,尽量避免复杂的sql语句,不要查询不必要的数据,如有必要再加上索引。