小伙伴们在使用MySQL数据库的时候经常会使用到索引,而且索引也是面试过程中经常被问到的知识点,今天我们来一起总结一下索引的相关知识点。
1.什么是索引
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针,打个比方,如果数据库是一本书的话,那索引就是书的目录,使用索引可以加快数据库的查询效率,就好比用目录可以快速找到书里想找的内容。
一般数据库默认会为每一张表的主键生成索引。索引分为聚集索引和非聚集索引。聚集索引是按照数据库数据存放的物理位置顺序,一般多行查询效率高。非聚集索引则是对单行查找效率更高。
2.索引类型
一般索引分为普通索引、唯一索引、全文索引、单列、多列索引、组合索引。
1)普通索引 最基本的索引,没任何限制,MyISAM默认B树类索引
2)唯一索引 相比于普通索引只是要求索引列的值必须唯一,但允许索引列为NULL值
3)全文索引 FULLTEXT索引只能用于MyISAM表
4)单列索引、多列索引
5)组合索引 遵循最左前缀的原则
3.如何选择索引
尽管索引可以提高查询效率,但这不是绝对的!虽然索引就是为提高查询效率而生的,但是如果用错了索引不仅无法提高查询效率,有时候反而会影响数据库的性能。那么该怎么选择合适的索引的,小编总结了一下分享给大家。
数据操作 | 使用聚集索引 | 使用非聚集索引 |
---|---|---|
列经常分组排序 | ✔ | ✔ |
返回指定范围内的数据 | ✔ | ✖ |
一个或极少不同值 | ✖ | ✖ |
小数目的不同值 | ✔ | ✖ |
大数目的不同值 | ✖ | ✔ |
频繁更新的列 | ✖ | ✔ |
主键列 | ✔ | ✔ |
外键列 | ✔ | ✔ |
频繁修改索引列 | ✖ | ✔ |
4.索引的注意事项
1)索引索引不会包含NULL值的列
只要列中包含有NULL值,就不会被包含在索引中,复合索引中只要有一列中包含NULL值,那么该列对于数据库就是无效的,因此对于添加索引的列数值值不要设置默认为NULL
2)尽可能地地使用短索引
对串列对串列进行索引,应指定一个前缀长度。短索引不仅可以提高查询效率,而且可以节省磁盘空间和I/O操作
3)不要对索引列排序
MySQL查询只能有一个只能有一个索引,如果where子句中如果使用了索引,那么Order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下情况下不要对索引进行排序操作。尽量不要包含多个列的排序,如果需要建议给这些列创建复合索引。
4)like语句操作
一般like“%aaa%”不支持索引,like“aaa%”支持索引。
5)禁止在索引列上计算
不要在列上计算,这样会导致索引失效而进行全表扫描,造成数据库查询性能下降。