热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL的索引结构_MySQL

MySQL的索引结构
bitsCN.com

MySQL的索引结构

1.索引基础

索引是存储引擎用于快速找到记录的一种数据结构。存储引擎先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。索引可以包含一个列或者多个列的值,如果索引包含多个列,那么列的顺序就会变得比较重要了。

2.索引的优缺点

2.1优点

1. 提高了查询速度

2. 减少了数据读取操作(IO)

3. 降低排序和分组的成本(CPU)

2.2缺点

1. 占用了大量的存储空间

2. insert、update和delete等操作会消耗大量的系统开销

3索引的类型

根据存储结构的不同,将索引分为两种:B-Tree索引和哈希索引。

3.1B-Tree索引

1. 平衡的多路查找树

2. 所有的值都是按顺序存储

3. 每一个叶子页到根的距离相同

4. 查找过程:查找节点+节点内查找,性能等价于在键值的集合中做一次二分查找

5. MyISAM引擎均使用B-Tree索引,InnoDB引擎使用B+Tree索引

6. B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索

3.2Hash索引

对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

在MySQL中只有Memory存储引擎显示支持哈希索引。

4.高效的索引策略

4.1独立的列

1. 索引列不能是表达式的一部分,或者函数的参数

4.2前缀索引和索引选择性

1. 索引开始的部分字符

2. 要选择足够长的前缀以保证较高的选择性,同时又不能太长

4.3多列索引

1. 在多个列上建立独立的索引并不能提高MySQL的查询性能

2. 多个列建立一个多列索引,可以方便有AND,OR或者排序查询等操作

4.4选择合适的索引列顺序

1. 当不需要考虑排序和分组时,将选择性最高的列放在前面

2. 性能不仅依赖于所有索引列的选择性,也和查询条件的具体值相关,也就是和具体值的分布相关。

4.5聚簇索引

4.5.1聚簇索引的主要特定:

1. 聚簇索引不是一种单独的索引类型,而是一种数据存储方式

2. InnoDB的聚簇索引实际上在同一个结构上保存了B-Tree索引和数据行

3. 聚簇表示数据行和相邻的键值紧凑地存储在一起

4. InnoDB引擎支持聚簇索引

5. 数据文件本身即索引文件

6. 叶子节点数据域保存的是完整的数据行

7. InnoDB通过主键聚集数据,如果没有主键,会选择一个唯一的非空索引代替,如果没有这种索引,会隐式定义一个主键来作为聚簇索引

8. InnoDB的二级索引中保存的不是指向行的物理位置的指针,而是行的主键值

4.5.2聚簇索引的优点:

1. 可以把相关数据保存在一起

2. 数据访问更快

3. 使用覆盖索引扫描的查询可以直接使用叶节点中的主键值

4.5.3聚簇索引的缺点:

1. 插入速度严重依赖于插入顺序

2. 更新聚簇索引列的代价很高,会强制InnoDB将每个被更新的行移动到新的位置

3. 二级索引访问需要两次索引查找,而不是一次,首先存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找到对应的行。

4.6覆盖索引

1.覆盖索引是指建立索引的字段正好是覆盖查询条件中所涉及的字段。

2.索引字段和条件字段满足最左前缀相同的原则

3.在EXPLAIN的EXtra列可以看到“Using index”的信息,表示可以进行覆盖索引

4.所需要的数据都在叶子层,找到正确的索引键值后不需要再利用指针做额外的查找

4.7未使用的索引

对于服务器永远用不到的索引,建议考虑删除。

5.索引的限制

1. 索引不是表达式的一部分,也不是函数的参数

2. 对于BLOG,TEXT或者VARCHAR类型的列,必须使用前缀索引,因为mysql不允许使用这些索引的完整长度

3. 只有当索引的列顺序和order by字句的顺序完全一致,而且所有列的排序方向都一样时,MySQL才能够使用索引对结果进行排序

4. 范围条件查询,mysql无法再使用范围列后面的其他索引列;多个等值条件查询,则没有这个限制

5. Mysql不能在索引中执行like '%A'的操作

6.合理的设计索引

1. 查询频繁的列适合建立索引

2. 频繁更新的列不适合建立索引

3. 索引选择性低的列不适合建立索引

4. 避免重复、冗余索引

5. 索引键值不宜过长,可以使用前缀索引

6. 联合索引需要考虑列的顺序,最好利用最左前缀

7.使用索引优化查询

1. 优化方式:通过explain查看执行计划

2. 最左前缀原则

3. 查询得到的数据行数过多时,不适用索引

4. ORDER BY语句尽量使用已有索引以减少排序成本

bitsCN.com
推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
author-avatar
Amy0807520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有