一、数据库索引简介

    索引的本质:通过不断的缩小范围来筛选出最终想要的结果,同时把随机的事件变成有顺序的事件。

 

    索引是对数据库表的一个或多个列的值进行排序的结构,使用索引可以快速检索数据库的特定信息。

    从数据搜索实现的角度而言,索引也是另一类的文件/记录,包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个

  子集都能够形成一个搜索码,字符段的任意一个子集都能形成一个搜索码。使得索引相当于所有的数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位

  所需的各种有效支持。

  能把查询记录限定在一定范围内的字段能成为索引,比如数据库表的主键、唯一键和普通键都可成为索引。

二、使用索引的优点 

  在设计数据库时,通过创建一个惟一的索引,使索引和信息之间形成一对一的映射式的对应关系,增加数据的惟一性特点

  能提高数据的搜索及检索速度。

  能够加快表与表之间的连接速度,对于提高数据的参考完整性方面具有重要作用。

三、索引的数据结构   

                 

  除开以上四种,还有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根本不能使用索引,效率会受到影响,需要优化

    修改SQL或者尽量让SQL走索引,给关键字加索引

 五、联合索引最左匹配原则

    最左匹配原则,mysql会一直向右匹配知道遇到范围查询(between、like)就停止匹配

    =和in可以乱序,mysql的查询优化器会优化成索引可以识别的形式 

  索引并不是建立的越多越好

    数据量小的表并不需要建立索引,建立会增加额外的索引开销 

    数据变更需要维护索引,更多的索引意味着更多的维护成本

    更多的索引意味着需要更多的空间 

  整体上来说mysql中的索引用到了b+树,链表,二分法查找,做到了快速定位目标数据,快速范围查找。

 

 

        

posted on 2019-12-27 16:15  Moolulu  阅读(222)  评论(0)    收藏  举报