网站建设与维护制作网页,近期国内热点新闻事件,做公司网站时的英文简介,前端设计除了做网站还能做什么1 MySQL索引都有哪些分类按数据结构分类可分为#xff1a;Btree索引、Hash索引、Full-text索引;按物理存储分类可分为#xff1a;聚簇索引、二级索引#xff08;辅助索引#xff09;;按字段特性分类可分为#xff1a;主键索引、普通索引、前缀索引;按字段个数分类可分为Btree索引、Hash索引、Full-text索引;按物理存储分类可分为聚簇索引、二级索引辅助索引;按字段特性分类可分为主键索引、普通索引、前缀索引;按字段个数分类可分为单列索引、联合索引复合索引、组合索引;2 按数据结构分类MySQL索引按数据结构分类可分为Btree索引、Hash索引、Full-text索引。-InnoDBMyISAMMemoryBtree索引√√√Hash索引××√Full-text索引√MySQL5.6√×注InnoDB实际上也支持Hash索引但是InnoDB中Hash索引的创建由存储引擎引擎自动优化创建不能人为干预是否为表创建Hash索引Btree 是MySQL中被存储引擎采用最多的索引类型。Btree 中的 B 代表平衡balance而不是二叉binary因为 Btree 是从最早的平衡二叉树演化而来的。下面展示Btree数据结构与其他数据结构的对比。2.1 Btree与B-tree的对比B-tree 中的每个节点根据实际情况可以包含多条数据信息和子节点如下图所示为一个3阶的B-tree相对于B-treeBtree有以下两点不同Btree 非叶子节点只存储键值信息 数据记录都存放在叶子节点中。而B-tree的非叶子节点也存储数据。所以Btree单个节点的数据量更小在相同的磁盘I/O次数下能查询更多的节点。Btree 所有叶子节点之间都采用单链表连接。适合MySQL中常见的基于范围的顺序检索场景而B-tree无法做到这一点。2.2 Btree与红黑树的对比红黑树是一种弱平衡二叉查找树。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制红黑树确保没有一条路径会比其他路径长出两倍。对于有N个叶子结点的 Btree其搜索复杂度为 O(logdN) 其中 d(degree) 为 Btree 的度表示节点允许的最大子节点个数为d个在实际应用当中d值一般是大于100的即使数据量达到千万级别时Btree的高度依然维持在3-4左右保证了3-4次磁盘I/O操作就能查询到目标数据。红黑树是二叉树节点子节点个数为两个意味着其搜索复杂度为 O(logN)树的高度也会比 Btree 高出不少因此红黑树检索到目标数据所需经历的磁盘I/O次数更多。2.3 Btree与Hash的对比Hash 索引结构的特殊性其检索效率非常高索引的检索可以一次定位不像B-Tree 索引需要从根节点到枝节点最后才能访问到页节点这样多次的IO访问所以 Hash 索引的查询效率要远高于 B-Tree 索引。虽然 Hash 索引效率高但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端主要有以下这些。Hash 索引仅仅能满足 , IN 和 (表示NULL安全的等价) 查询不能使用范围查询。由于 Hash 索引比较的是进行 Hash 运算之后的 Hash值所以它只能用于等值的过滤不能用于基于范围的过滤因为经过相应的 Hash算法处理之后的 Hash 值的大小关系并不能保证和Hash运算前完全一样。Hash 索引无法适用数据的排序操作。由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash值而且Hash值的大小关系并不一定和 Hash运算前的键值完全一样所以数据库无法利用索引的数据来避免任何排序运算Hash 索引不能利用部分索引键查询。对于组合索引Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值而不是单独计算 Hash值所以通过组合索引的前面一个或几个索引键进行查询的时候Hash 索引也无法被利用。Hash 索引依然需要回表扫描。Hash 索引是将索引键通过 Hash 运算之后将 Hash运算结果的 Hash值和所对应的行指针信息存放于一个 Hash 表中由于不同索引键可能存在相同 Hash 值所以即使取满足某个 Hash 键值的数据的记录条数也无法从 Hash索引中直接完成查询还是要通过访问表中的实际数据进行相应的比较并得到相应的结果。Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。选择性比较低的索引键如果创建 Hash 索引那么将会存在大量记录指针信息存于同一个Hash值相关联。这样要定位某一条记录时就会非常麻烦会浪费多次表数据的访问而造成整体性能低下由于范围查询是MySQL数据库查询中常见的场景Hash表不适合做范围查询它更适合做等值查询。另外Hash表还存在Hash函数选择和Hash值冲突等问题。因此Btree索引要比Hash表索引有更广的适用场景。3 按物理存储分类MySQL索引按叶子节点存储的是否为完整表数据分为聚簇索引、二级索引辅助索引。全表数据存储在聚簇索引中聚簇索引以外的其他索引叫做二级索引也叫辅助索引。3.1 聚簇索引聚簇索引的每个叶子节点存储了一行完整的表数据叶子节点间按id列递增连接可以方便地进行顺序检索。InnoDB表要求必须有聚簇索引默认在主键字段上建立聚簇索引在没有主键字段的情况下表的第一个非空的唯一索引将被建立为聚簇索引在前两者都没有的情况下InnoDB将自动生成一个隐式的自增id列并在此列上建立聚簇索引。以MyISAM为存储引擎的表不存在聚簇索引。MyISAM表中的主键索引和非主键索引的结构是一样的索引的叶子节点不存储表数据存放的是表数据的地址。所以MyISAM表可以没有主键。MyISAM表的数据和索引是分开存储的。MyISAM表的主键索引和非主键索引的区别仅在于主键索引的Btree上的key必须符合主键的限制非主键索引Btree上的key只要符合相应字段的特性就可以了。3.2 二级索引二级索引的叶子节点并不存储一行完整的表数据而是存储了聚簇索引所在列的值。回表查询由于二级索引的叶子节点不存储完整的表数据索引当通过二级索引查询到聚簇索引列值后还需要回到聚簇索引也就是表数据本身进一步获取数据。回表查询 需要额外的 Btree 搜索过程必然增大查询耗时。需要注意的是通过二级索引查询时回表不是必须的过程当SELECT的所有字段在单个二级索引中都能够找到时就不需要回表MySQL称此时的二级索引为覆盖索引或触发了索引覆盖。可以用Explain命令查看SQL语句的执行计划执行计划的Extra字段中若出现Using index表示查询触发了索引覆盖。4 按字段特性分类MySQL索引按字段特性分类可分为主键索引、普通索引、前缀索引。4.1. 主键索引建立在主键上的索引被称为主键索引一张数据表只能有一个主键索引索引列值不允许有空值通常在创建表时一起创建。4.2. 唯一索引建立在UNIQUE字段上的索引被称为唯一索引一张表可以有多个唯一索引索引列值允许为空列值中出现多个空值不会发生重复冲突。4.3. 普通索引建立在普通字段上的索引被称为普通索引。4.4. 前缀索引前缀索引是指对字符类型字段的前几个字符或对二进制类型字段的前几个bytes建立的索引而不是在整个字段上建索引。前缀索引可以建立在类型为char、varchar、binary、varbinary的列上可以大大减少索引占用的存储空间也能提升索引的查询效率。5 按索引字段个数分类MySQL索引按字段个数分类可分为单列索引、联合索引复合索引、组合索引。5.1. 单列索引建立在单个列上的索引被称为单列索引。5.2. 联合索引复合索引、组合索引建立在多个列上的索引被称为联合索引又叫复合索引、组合索引。