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.如果列是字符串类型,一定要加引号,不然索引失效。

  

原文地址:https://www.cnblogs.com/juanzhi/p/12562510.html