iis中的网站启动不了,沧州网站建设公司电话,网页设计公司有哪些国内,周口航迪科技网站建设公司怎么样索引在 MySQL 数据库中分三类#xff1a;
B 树索引Hash 索引全文索引
目的#xff1a;在查询的时候提升效率
b树
参考#xff1a;https://blog.csdn.net/qq_40649503/article/details/115799935
数据库索引#xff0c;是数据库管理系统中一个排序的数据结构#xf…
索引在 MySQL 数据库中分三类
B 树索引Hash 索引全文索引
目的在查询的时候提升效率
b树
参考https://blog.csdn.net/qq_40649503/article/details/115799935
数据库索引是数据库管理系统中一个排序的数据结构以协助快速查询、更新数据库表中数据。索引的实现通常使用B_TREE。B_TREE索引加速了数据访问因为存储引擎不会再去扫描整张表得到需要的数据相反它从根节点开始根节点保存了子节点的指针存储引擎会根据指针快速寻找数据。
B 树和 B 树的不同
①B 树非叶子节点上是不存储数据的仅存储键值而 B 树节点中不仅存储键值也会存储数据。
之所以这么做是因为在数据库中页的大小是固定的InnoDB 中页的默认大小是 16KB。
如果不存储数据那么就会存储更多的键值相应的树的阶数节点的子节点树就会更大树就会更矮更胖如此一来我们查找数据进行磁盘的 IO 次数又会再次减少数据查询的效率也会更快。
另外B 树的阶数是等于键值的数量的如果我们的 B 树一个节点可以存储 1000 个键值那么 3 层 B 树可以存储 1000×1000×100010 亿个数据。
一般根节点是常驻内存的所以一般我们查找 10 亿数据只需要 2 次磁盘 IO。
②因为 B 树索引的所有数据均存储在叶子节点而且数据是按照顺序排列的。
那么 B 树使得范围查找排序查找分组查找以及去重查找变得异常简单。而 B 树因为数据分散在各个节点要实现这一点是很不容易的。
有心的读者可能还发现上图 B 树中各个页之间是通过双向链表连接的叶子节点中的数据是通过单向链表连接的。
其实上面的 B 树我们也可以对各个节点加上链表。这些不是它们之前的区别是因为在 MySQL 的 InnoDB 存储引擎中索引就是这样存储的。
也就是说上图中的 B 树索引就是 InnoDB 中 B 树索引真正的实现方式准确的说应该是聚集索引聚集索引和非聚集索引下面会讲到。
通过上图可以看到在 InnoDB 中我们通过数据页之间通过双向链表连接以及叶子节点中数据之间通过单向链表连接的方式可以找到表中所有的数据。
MyISAM 中的 B 树索引实现与 InnoDB 中的略有不同。在 MyISAM 中B 树索引的叶子节点并不存储数据而是存储数据的文件地址。
聚集索引 VS 非聚集索引
在上节介绍 B 树索引的时候我们提到了图中的索引其实是聚集索引的实现方式。
那什么是聚集索引呢在 MySQL 中B 树索引按照存储方式的不同分为聚集索引和非聚集索引。
这里我们着重介绍 InnoDB 中的聚集索引和非聚集索引
①聚集索引聚簇索引以 InnoDB 作为存储引擎的表表中的数据都会有一个主键即使你不创建主键系统也会帮你创建一个隐式的主键。
这是因为 InnoDB 是把数据存放在 B 树中的而 B 树的键值就是主键在 B 树的叶子节点中存储了表中所有的数据。
这种以主键作为 B 树索引的键值而构建的 B 树索引我们称之为聚集索引。
②非聚集索引非聚簇索引以主键以外的列值作为键值构建的 B 树索引我们称之为非聚集索引。
非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据而是存储该列对应的主键想要查找数据我们还需要根据主键再去聚集索引中进行查找这个再根据聚集索引查找数据的过程我们称为回表。
明白了聚集索引和非聚集索引的定义我们应该明白这样一句话数据即索引索引即数据。
hash索引
参考https://blog.csdn.net/weixin_43895297/article/details/88827631
https://zhuanlan.zhihu.com/p/113917726
哈希索引hash index基于哈希表实现只有精确匹配索引所有列的查询才有效。对于每一行数据存储引擎都会对所有的索引列计算一个哈希码hash code哈希码是一个较小的值并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中同时在哈希表中保存指向每个数据行的指针。
对于hash相同的采用链表的方式解决冲突。类似于hashmap。因为索引的结构是十分紧凑的所以hash索引的查询很快。 Hash 索引结构的特殊性其检索效率非常高索引的检索可以一次定位不像B-Tree 索引需要从根节点到枝节点最后才能访问到页节点这样多次的IO访问所以 Hash 索引的查询效率要远高于 B-Tree 索引。
hash索引的不足 1).Hash 索引仅仅能满足””,”IN”和””查询不能使用范围查询。 由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值所以它只能用于等值的过滤不能用于基于范围的过滤因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系并不能保证和Hash运算前完全一样。 2).Hash 索引无法被用来避免数据的排序操作。 由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样所以数据库无法利用索引的数据来避免任何排序运算 3).Hash 索引不能利用部分索引键查询。 对于组合索引Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值而不是单独计算 Hash 值所以通过组合索引的前面一个或几个索引键进行查询的时候Hash 索引也无法被利用。 4).Hash 索引在任何时候都不能避免表扫描。 前面已经知道Hash 索引是将索引键通过 Hash 运算之后将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中由于不同索引键存在相同 Hash 值所以即使取满足某个 Hash 键值的数据的记录条数也无法从 Hash 索引中直接完成查询还是要通过访问表中的实际数据进行相应的比较并得到相应的结果。 5).Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 对于选择性比较低的索引键如果创建 Hash 索引那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦会浪费多次表数据的访问而造成整体性能低下
简单地说哈希索引就是采用一定的哈希算法把键值换算成新的哈希值检索时不需要类似B树那样从根节点到叶子节点逐级查找只需一次哈希算法即可立刻定位到相应的位置速度非常快。
从上面的图来看B树索引和哈希索引的明显区别是 1).如果是等值查询那么哈希索引明显有绝对优势因为只需要经过一次算法即可找到相应的键值当然了这个前提是键值都是唯一的。如果键值不是唯一的就需要先找到该键所在位置然后再根据链表往后扫描直到找到相应的数据 2).从示意图中也能看到如果是范围查询检索这时候哈希索引就毫无用武之地了因为原先是有序的键值经过哈希算法后有可能变成不连续的了就没办法再利用索引完成范围查询检索 3).同理哈希索引也没办法利用索引完成排序以及like ‘xxx%’ 这样的部分模糊查询这种部分模糊查询其实本质上也是范围查询 4).哈希索引也不支持多列联合索引的最左匹配规则 5).B树索引的关键字检索效率比较平均不像B树那样波动幅度大在有大量重复键值情况下哈希索引的效率也是极低的因为存在所谓的哈希碰撞问题。
hash索引和b树索引的区别 复合索引的最左匹配原则
参考http://www.mybatis.cn/archives/403.html 创建索引的类型
主键 primary
唯一 unique
全文 fulltext
普通
复合索引 多个列一起建立一个索引
使用索引的缺点
修改了数据mysql会去修改索引的导致mysql的性能下降维护索引的开销是比较大
哪些字段上适合建立索引
和行的数量越接近越好
说明这个索引就越有用值得建立
如果某个列的取值范围很广几乎没有重复的值称为高选择性的列添加b树索引最合适。
优化思路
查询数据的时候很慢 数据库优化的思路 1. 加硬件 cpu内存磁盘网络带宽 --》加机器 --》简单粗暴 --》效果非常好 2.优化软件 2.1 优化linux操作系统的内核参数 2.2 关闭不需要的服务和进程 2.3 MySQL的配置参数的优化 buffer_pool 等 2.4 SQL语句的优化 子查询连接查询 --》索引 创建索引 2.5 分表分库 分表 将一个大表拆分成多个小表 分库 将多个表拆分到不同的库里然后不同库跑到不同机器上 分区 使用分区技术 2.6 使用中间件缓存--》redis等 2.7 使用集群
总结 优化的思想 1.加硬件 2.优化软件 --》使用最多 3.加机器 4.加缓存