zoukankan      html  css  js  c++  java
  • mysqL索引

    MySQL有索引类型;
    从数据结构角度可分为B+树索引、哈希索引、以及不常用的FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)和R-Tree索引(用于对GIS数据类型创建SPATIAL索引);
    从物理存储角度可分为聚集索引(clustered index)、非聚集索引(non-clustered index);
    从逻辑角度可分为主键索引、普通索引,或者单列索引、多列索引、唯一索引、非唯一索引等等。

    主键索引和唯一索引的区别是什么:
    唯一索引:唯一索引不允许两行具有相同的索引值。
    主键索引:主键索引是唯一索引的特殊类型。数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。
    (1)对于主健/unique constraint , oracle/sql server/mysql等都会自动建立唯一索引;
    (2)主键不一定只包含一个字段,所以如果你在主键的其中一个字段建唯一索引还是必要的;
    (3)主健可作外健,唯一索引不可;
    (4)主健不可为空,唯一索引可;
    (5)主健也可是多个字段的组合;
    (6)主键有not null属性;每个表只能有一个
    聚集索引和非聚集索引的区别:
    聚集索引:每个表中只能有一个聚集索引,innodb聚集索引与数据记录存储在一起,有序存储在叶节点。查询快,修改慢
    非聚集索引:每个表可以有多个非聚集索引,非聚集索引存储的是指向聚集索引的指针,指定了表中记录的逻辑顺序.修改快
    聚集索引和非聚集索引都采用了B+树的结构

    一,查询B+树索引的流程
    B+树索引找到叶节点,再找到对应的数据页,然后将数据页加载到内存中,通过二分查找Page Directory中的槽,查找出一个粗略的目录,然后根据槽的指针指向链表中的行记录,之后在链表中依次查找。

    需要注意的地方是,B+树索引不能找到具体的一条记录,而是只能找到对应的页。把页从磁盘装入到内存中,再通过Page
    Directory进行二分查找,同时此二分查找也可能找不到具体的行记录(有可能会找到),只是能找到一个接近的链表中的点,再从此点开始遍历链表进行查找。
    二,聚簇索引与非聚簇索引

    B+树索引可以分为聚集索引和辅助索引,他们不同点是,聚集索引的行数据和主键B+树存储在一起,辅助索引只存储辅助键和主键。

    1.聚集索引

    聚集索引是按每张表的主键构造的一颗B+树,并且叶节点中存放着整张表的行记录数据,因此也让聚集索引的节点成为数据页,这个特性决定了索引组织表中数据也是索引的一部分。由于实际的数据页只能按照一颗B+树进行排序,所以每张表只能拥有一个聚集索引。查询优化器非常倾向于采用聚集索引,因为其直接存储行数据,所以主键的排序查询和范围查找速度非常快。

    不是物理上的连续,而是逻辑上的,不过在刚开始时数据是顺序插入的所以是物理上的连续,随着数据增删,物理上不再连续

    2.辅助索引

    辅助索引页级别不包含行的全部数据。叶节点除了包含键值以外,每个叶级别中的索引行中还包含了一个书签,该书签用来告诉InnoDB哪里可以找到与索引相对应的行数据。其中存的就是聚集索引的键。

    辅助索引的存在并不影响数据在聚集索引的结构组织。InnoDB会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后通过主键索引找到一个完整的行记录。当然如果只是需要辅助索引的值和主键索引的值,那么只需要查找辅助索引就可以查询出索要的数据,就不用再去查主键索引了。

    三,索引的管理

    索引在创建或者删除时,MySQL会先创建一个新的临时表,然后把数据导入临时表,删除原表,再把临时表更名为原表名称。

    但是在InnoDB Plugin版本开始,支持快速创建索引。其原理是先在InnoDB上加一个s锁,在创建过程中不需要建表,所以速度会很快。创建过程中由于加了s锁,所以只能进行读操作,不能写操作。

    show index form table;是查看表中索引的信息的。

    Table:索引所在的表名

    Non_unique:非唯一的索引,可以看到primary key 是0,因为必须是唯一的

    Key_name:索引名称

    Seq_in_index:索引中该列的位置

    Column_name:索引的列

    Collation:列以什么方式存储在索引中。可以是A或者NULL,B+树索引总是A,即排序的。

    Cardinality:表示索引中唯一值的数目的估计值。如果非常小,那么需要考虑是否还需要建立这个索引了。优化器也会根据这个值来判断是否使用这个索引。

    Sub_part:是否是列的部分被索引。100表示只索引列的前100个字符。

    Packed:关键字如果被压缩。

    Null:是否索引的列含有NULL值。

    Index_type:索引的类型。InnoDB只支持B+树索引,所以显示BTREE

  • 相关阅读:
    virtualbox 5.0.6 在debian jessie amd64启动报错
    golang中的检验hash
    删除多余的自编译的内核、mysql连接不了的问题
    scoket常用函数简单介绍
    我的bootstrap学习
    TCP/IP四层模型和OSI七层模型
    五种调试方法
    实现对一个8bit数据的指定位的置0或者置1操作,并保持其他位不变。
    如何测试一个杯子
    黑白盒测试及区别、测试用例的设计(测试小笔记)
  • 原文地址:https://www.cnblogs.com/youhunyimeng/p/6407489.html
Copyright © 2011-2022 走看看