首页 > 数据库 >mysql中的索引

mysql中的索引

时间:2023-11-26 14:23:42浏览次数:40  
标签:mysql 查询 索引 二叉树 使用 磁盘 节点

mysql中索引的实现方式是什么?

利用B+树实现索引的。

数据库中的数据存储在磁盘上,使用的时候加载到存储引擎中的buffer pool(内存中的一个缓存池)中去;同理索引也是以文件的形式存储在磁盘上的,使用的时候加载到buffer pool中去。

注意:数据和索引都是以“页”的形式一页一页的加载进内存的(具体请看操作系统的内存管理中的页式内存)

B+树的特点:
非叶子节点只存在索引值和指向下一个子节点的指针,而叶子节点既包含索引值也包含具体的数据,且每个节点上的索引值都是按升序排序的

为什么使用使用B+树索引,而不使用二叉树(二叉搜索树、平衡二叉树等)、以及Hash索引?

  1. B+树 VS B树:

    • 由于B树的所有节点都包含索引值和具体的数据,所以相对而言B+树的单个非叶子节点所需要的空间更小,一次磁盘IO读进buffer pool的节点更多
    • B+树的叶子节点之间用双向链表的形式串起来了,使得B+树索引更适合范围查询
  2. B+树 VS 二叉树:

    • 二叉树中一个节点只有两个子节点,当数据量非常大的时候,二叉树的高度就会很高,导致二叉树一次查询会需要很多次的磁盘IO操作;而B+树不限制子节点的数量,能将树的高度一直维持在3~4层,一次IO查询只需要很少的磁盘IO操作
  3. B+树 VS 哈希索引:

    • 哈希索引在等值查询上能做到O(1)的时间复杂度
    • 但是哈希索引不适合做范围查询,因为哈希索引无序

什么时候适合使用索引进行查询?

  1. 字段具有唯一性

  2. 常用于where、order by、group by的字段

不适合使用索引进行查询的情况?

(由于索引的建立和管理是占用一定的开销的,所以在有些情况使用索引反而会降低性能)

  1. 字段不具有唯一性。如表中有个字段是性别,由于性别只有男女,如果对其建立索引查询时,只能分辨出男女两个范围,无法将数据进行更细力度的划分

  2. 不常用于where、order by、group by的字段

  3. 经常被修改的字段

  4. 表中的数据很少时

什么情况下索引会失效?

  1. 使用左模糊匹配或者左右模糊匹配

  2. 对索引字段使用了函数、计算表达式、类型转换

  3. 在联合索引时,没有遵循“最左匹配”的原则

  4. where子句进行条件查询时,若出现or关键字连接两个条件,且一个条件是索引字段,一个条件不是时会出现索引失效

有什么提高索引性能的方法?

  1. 使用前缀索引。前缀索引是指将字段的前几个字符作为索引,而不将整个字段作为索引。这样整个节点会消耗更小的空间,从而一个索引页中可以存储更多的索引项

  2. 使用覆盖索引。覆盖索引是指二级索引就能直接获取查询想要的字段,而不需要回表操作

  3. 使主键索引自增。主键值自增的话,在插入新数据时,只需要在主键索引B+树进行追加操作,而不需要重新移动其他节点

  4. 防止索引失效

标签:mysql,查询,索引,二叉树,使用,磁盘,节点
From: https://www.cnblogs.com/sunjuil/p/17856918.html

相关文章

  • mysql+php+apache的docker坏境搭建
    1:安装dockersudoaptinstalldocker.io2:安装mysqlsudodockerrun--privileged=true-di--restart=always--nameMySqlForPhp01-p55506:3306-eMYSQL_ROOT_PASSWORD=1234qwer-e--character-set-server=utf8mb4-e--collation-server=utf8mb4_unicode_cimysql:8.0......
  • MySQL_事务
    事务的特性ACIDA原子性:一个事务中的所有操作,要么全部完成,要么全部不完成。undolog保证C一致性:事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。原子性、隔离性、持久性保证I隔离性:多个并发事务交叉执行,使用相同的数据时,互不干扰,每个事务都有一个完整的数据空间......
  • Windows环境下修改my.ini导致MySQL启动失败
    问题:修改my.ini导致MySQL启动失败在Windows环境中,使用默认编辑器编辑my.ini配置文件可能导致MySQL启动失败,是因为默认编辑器使用的是UTF-8编码。解决方法:更改编码为ANSI使用文本编辑器打开my.ini,选择“另存为”并将编码更改为ANSI。重新启动MySQL服务,确保配置文件与MySQL默认......
  • 大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异
    最近有客户在使用Elasticsearch搜索服务时发现集群有掉节点,并且有master收集节点信息超时的日志,节点的负载也很高,不只是data节点,master和协调节点的cpu使用率都很高,看现象集群似乎遇到了性能瓶颈。查看了Hot_threads,发现大量线程被权限验证相关的类和方法占用,主要在RB......
  • 大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异
    最近有客户在使用Elasticsearch搜索服务时发现集群有掉节点,并且有master收集节点信息超时的日志,节点的负载也很高,不只是data节点,master和协调节点的cpu使用率都很高,看现象集群似乎遇到了性能瓶颈。查看了Hot_threads,发现大量线程被权限验证相关的类和方法占用,主要在......
  • mysql多个字段最大最小值
    转自:https://www.jb51.net/article/263686.htm1、语法最大值:GREATEST(expr_1,expr_2,...expr_n)最小值:LEAST(expr_1,expr_2,...expr_n)2、说明GREATEST(expr_1,expr_2,...expr_n)函数从表达式(列、常量、计算值)expr_1,expr_2,...expr_n等中找出最大的数返回......
  • 关于点赞业务对MySQL和Redis和MongoDB的思考
    点赞​ 在我个人理解中,点赞业务比较频繁,很多人业务可能都会有这个,比如:博客,视频,文章,动态,评论等,但是不应该是核心业务,不应该大量地请求MySQL数据库,给数据库造成大量的资源消耗,MySQL的数据库是非常宝贵的.以某音为例,当我去搜索的时候,全抖音比较高的点赞数目应该是在1......
  • mysql定时备份
    mysql定时备份概述:​1、一般来说,生产服务器每天都需要定期进行数据备份、异地备份,这样确保意外情况(数据意外删除、硬件故障、火灾等等)下避免数据大批量丢失,能快速恢复数据,把意外带来的影响降到到最小。数据库数据备份尤为重要,而我们不会人工手动去备份,这样会很麻烦,我们都是通过......
  • ubuntu下mysql57重置密码
    重置密码:重置MySQLroot用户的密码。在安全模式下启动MySQL(root下),然后更改密码。sudoservicemysqlstopsudomysqld_safe--skip-grant-tables&mysql-uroot在MySQL中执行以下SQL语句:USEmysql;UPDATEuserSETauthentication_string=PASSWORD('your_new_pa......
  • windows中MySQL忘记密码
    前言:  一直都是连接公司项目数据库,许久未连接本地的数据库,密码忘记了 步骤:进入本机安装mysql的bin目录下暂停mysql服务 netstopmysql设置跳过密码授权登录 mysqld--console--skip-grant-tables--shared-memory 新开命令行窗口,输入mysql-uroot无密码登录修......