zoukankan      html  css  js  c++  java
  • mysql关于索引

    为什么要引入索引

      使用索引的全部意义就是:通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。 (类比于书的目录结构)。

      一个索引是存储的表中一个特定列的值的数据结构。索引包含一个列中的所有的值,并且这些值存储在一个数据结构中。

      在关系型数据库中,索引是一种单独的、物理的对数据表中一列或多列的值进行排序的一种存储结构, 它是某个表中一列或若干列值的集合和对应的指向表中物理标

    识这些值的数据页的逻辑清单。    

    索引的数据结构

       1.HASH 与 BTREE

        常见的数据结构有两种:

         hash哈希结构,增/删/改/查平均时间复杂度都为O(1);

        Tree树结构,   增/删/改/查平均时间复杂度都为O(log(n));

      这样看,hash结构似乎更加快速,但是实际场景中可能  orderby 需要排个序,groupby 还要分个组,还要比较大小 大于或小于等等。如果继续用HASH类型做索引结构,其时间复杂度会从O(1)直接退化为O(n)。Tree的特性保证了不管是哪种操作,依然能够保持O(log(n))的高效率。

      2.BTREE

      BTREE,又叫多路平衡查找树,B树的查找基本包含两个操作:1) 在B树中找结点  2)在结点内找关键字。由于B树通常存储在磁盘中,则前一个操作通常在磁盘上进行的,而后一个查找操作是在内存中进行的。

      3.B+树

      应数据库所需而出现的B树的变形。

    索引衡量标准——Cardinality 索引基数

      索引基数简单的说就是:你索引列的唯一值的个数,如果是复合索引就是唯一组合的个数。

      这个值将会作为MySQL优化器对语句执行计划进行判定时依据,如果唯一性太小,那么优化器会认为这个索引对语句没有太大帮助,而不使用索引。索引基数值越

    大,就意味着索引能排除更多重复合的数,也就更为高效。

    索引类型

      普通索引

      唯一索引:唯一性约束,但是可以有NULL值

      主键索引:一张表只能有一个主键索引,不允许重复的值,也不允许NULL值,

      组合索引

      外键索引:只有InnoDB类型的表才能使用外键索引。

      全文索引:没啥卵用

    索引创建的原则

    • 数据列中不重复的个数越多,越适合创建索引。
    • 对于 where ,on, group by ,order by 中出现的列使用索引,
    • 索引列的基数越大越好,索引的效果越好。
    • 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。比如:

        firstname,varchar(50);用 alter table employee add key(firstname(5))来对前5个字符设置索引

    • 使用组合索引,要优于多个单列索引
    • 查询多的更适合创建索引,DML多的不适合索引,因为每次增删改都得重新建立索引。

    索引注意事项

      1.复合索引遵循前缀原则。

      2.like查询,%不能在前,索引会失效,可采用全文索引。

      3.or前面的有索引,后面的没有,都不会用到。

      4.如果列是字符串类型,一定要加引号,不然索引失效。

      

  • 相关阅读:
    Java8-19-lambda 重构代码
    iOS 客户端与服务端做时间同步
    如何安装及使用honmaple社区程序 · honmaple's blog · 风落花语风落天,花落风雨花落田.

    吴裕雄--天生自然 JAVASCRIPT开发学习:计时事件
    吴裕雄--天生自然 JAVASCRIPT开发学习:弹窗
    吴裕雄--天生自然 JAVASCRIPT开发学习:Window
    吴裕雄--天生自然 JAVASCRIPT开发学习:RegExp 对象
    吴裕雄--天生自然 JAVASCRIPT开发学习:Math(算数) 对象
    吴裕雄--天生自然 JAVASCRIPT开发学习:Array(数组) 对象
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12562510.html
Copyright © 2011-2022 走看看