1、MySQL索引
1.1、为什么要有索引?
为了提高查询效率
1.2、什么是索引?
索引在MySQL中也叫做一种“键”,是存储引擎用于快速找到记录的一种数据结构,索引对于良好的查询性能非常关键,尤其是当数据量大的时候
1.3、索引的原理
本质是:通过不断的缩小想要获取的数据的范围来筛选出最终想要的结果,同事把随机的事件变成顺序的事情,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据;
MySQL索引使用的的数据结构有BTrees索引和哈希索引;
对于哈希索引而言,底层的数据结构是哈希表,因此在绝大多数需求为单条记录查询的时候可以选择哈希索引,查询效果最快;其他大部分场景使用BTree索引;
BTrees索引使用的是B树中的B+Tree,对于两种不同的引擎实现方式不同:
- MyISAM:B+Tree的叶节点的data域存放的是数据记录的地址;在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定key存在,则取出其data域的值作为地址读取相应的数据记录。这叫“非聚簇索引”
- InnoDB:其数据文件本身就是索引文件。相比MyISAM,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
2、创建索引遵循的规则
- 唯一性索引:唯一性索引的值具有唯一性,可以更快的通过该索引确定某条记录
- 为经常需要排序、分组、和联合操作的字段建立索引:经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作
- 为常用的查询条件创建索引:如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度
- 限制索引的数目:每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间
- 尽量使用数据量少的索引:如果索引的值很长,那么查询的速度会受到影响
- 尽量使用前缀来索引:如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度
- 删除不再使用或者使用很少的索引:表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。 数据库 管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响
3、索引会在什么情况下失效
- 理想状态是:全值匹配
- 违反索引的最左原则:缺少左边的索引字段
- 在索引列上做任何操作:函数、计算、转换类型等
- 索引范围条件右边的列:大于,小于
- 尽量使用覆盖索引:只访问索引查询,减少select *
- 使用不等于:!=,<>,属于覆盖索引外
- like以通配符开头:like “%123”
- 字符串不加单引号
- or链接
- order by:违反最左前缀法则、含非索引字段排序,会导致文件排序
- group by:违反最左前缀法则、含非索引字段排序,会导致产生临时表