一、数据库索引简介
索引的本质:通过不断的缩小范围来筛选出最终想要的结果,同时把随机的事件变成有顺序的事件。
索引是对数据库表的一个或多个列的值进行排序的结构,使用索引可以快速检索数据库的特定信息。
从数据搜索实现的角度而言,索引也是另一类的文件/记录,包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个
子集都能够形成一个搜索码,字符段的任意一个子集都能形成一个搜索码。使得索引相当于所有的数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位
所需的各种有效支持。
能把查询记录限定在一定范围内的字段能成为索引,比如数据库表的主键、唯一键和普通键都可成为索引。
二、使用索引的优点
在设计数据库时,通过创建一个惟一的索引,使索引和信息之间形成一对一的映射式的对应关系,增加数据的惟一性特点。
能提高数据的搜索及检索速度。
能够加快表与表之间的连接速度,对于提高数据的参考完整性方面具有重要作用。
三、索引的数据结构
除开以上四种,还有BitMap位图索引
数据库索引一般优先考虑B+-Tree结构,因为B+-Tree存储索引的优点在于:
1)B+树的磁盘读写代价更低
2)B+树的查询效率更加稳定
3)更有利于对数据库的扫描
Hash索引也可以考虑,但利用Hash索引做索引结构的缺点有
1)仅仅能满足“=”、IN,不能使用范围查询
2)由于Hash中存放的是经过Hash运算的值,Hash值的大小关系并不一定和Hash运算前的键值大小完全一致,所以无法用索引来避免数据的排序操作
3)不能利用部分索引键查询
4)不能避免表扫描
5)遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
⚠️MySQL数据库不支持BitMap索引结构,同时基于InnoDB和MyISAM的索引引擎的MySQL不支持Hash数据结构,MySQL默认索引引擎为InnoDB
四、MySql利用索引优化
1、优化慢查询SQL
根据慢日志定位查询SQL
SHOW VARIABLES LIKE '%query%' 关注:slow_query_log(慢日志开关) slow_query_log_file(慢日志文件路径) long_query_time(时间限制)
SHOW STATUS LIKE '%slow_queries%' 慢查询SQL数量
使用explain等分析查询SQL
type:显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL(优-->差)
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题
extra:包含MySQL解决查询的详细信息。
当extra出现Using filesort和Using temporary的时候意味着MySQL根本不能使用索引,效率会受到影响,需要优化
五、联合索引最左匹配原则
最左匹配原则,mysql会一直向右匹配知道遇到范围查询(between、like)就停止匹配
=和in可以乱序,mysql的查询优化器会优化成索引可以识别的形式
索引并不是建立的越多越好
数据量小的表并不需要建立索引,建立会增加额外的索引开销
数据变更需要维护索引,更多的索引意味着更多的维护成本
更多的索引意味着需要更多的空间
整体上来说mysql中的索引用到了b+树,链表,二分法查找,做到了快速定位目标数据,快速范围查找。