一、索引概念
索引(Index)是帮助MySQL高效获取数据的数据结构,可以得到索引的本质:索引是数据结构。
可以理解为“排好序的快速查找数据结构”
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
二、索引的优缺点
1. 优点
(1)类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本;
(2)通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
2. 缺点
(1)实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。
(2)虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
三、索引类别
1. 主键索引(PRIMARY)
2. 唯一索引(UNIQUE)
3. 普通索引(INDEX)
4. 组合索引
5. 全文索引(FULLTEXT)
注意:MySQL5.6以下只有 MYISAM引擎的表字段可以设置全文索引, MySQL5.6以上的INNODB引擎表才可以设置全文索引。但MYSQL5.7以下的版本都只能全文检索英文,5.7版本以上才能全文检索中文。(可参考:Mysql建立中英文全文索引)。
索引类别的详细说明+索引的创建/修改/删除,参考:MySQL索引类型。
四、索引结构
1. BTree索引
2. Hash索引
3. full-text全文索引
4. R-Tree索引
五、哪些情况需要建立索引
1. 主键自动建立唯一索引;
2. 频繁作为查询条件的字段需要建立索引;
3. 查询中与其他表关联的字段,外键关系需要建立索引;
4. 查询中进行排序的字段应该建立索引,提高排序速度;
5. 查询中分组或统计的字段应该建立索引;
6. 在搞并发的情况需要建立组合索引。
六、哪些情况不需要建立索引
1. 频繁更新的字段不适合建立索引;
2. where条件里用不到的字段不建立索引;
3. 表记录内容很少的情况下不建立索引;
4. 经常增删改的表内字段不建立索引;
5. 如果某个数据列包含许多重复的内容,为它建立索引也就没有太大的实际效果。
七、索引使用相关规则
字段类型转换导致不能用索引。如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;
mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;
不要在字段前面加减运算;
字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;
使用like时,“%关键词%” 用不到索引,只有“关键词%”才能用索引,关键词前面不能加%;
根据联合索引的第二个及以后的字段单独查询用不到索引;
不要使用 select *;
排序请尽量使用升序 ;
or 的查询尽量用 union 代替 (Innodb);
复合索引高选择性的字段排在前面;
order by / group by 字段包括在索引当中减少排序,效率会更高。