热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL索引详解(聚集索引与非聚集索引以及数据结构)

【摘要】一、索引的简介索引是存储引擎快速找到记录的一种数据结构,是数据库中专门用于帮助用户快速查询数据的一种数据结构,可以帮助用户快速寻找到需要的数据行

【摘要】一、索引的简介 索引是存储引擎快速找到记录的一种数据结构,是数据库中专门用于帮助用户快速查询数据的一种数据结构,可以帮助用户快速寻找到需要的数据行,是数据库性能优化中最重要的工具。 使用索引的主要目的是为了优化查询速度,它们包含着对数据表里所有记录的引用指针。简单的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 二、索引的分类  索引是在存储引擎中实现的,也就是说不同...

一、索引的简介

索引是存储引擎快速找到记录的一种数据结构,是数据库中专门用于帮助用户快速查询数据的一种数据结构,可以帮助用户快速寻找到需要的数据行,是数据库性能优化中最重要的工具。

使用索引的主要目的是为了优化查询速度,它们包含着对数据表里所有记录的引用指针。简单的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。


二、索引的分类

 索引是在存储引擎中实现的,也就是说不同的存储引擎会使用不同的索引,像:MyISAM 和 InnoDB 这两种存储引擎使用的索引结构是 B + tree ;Memory 存储引擎支持 Btree和hash 索引结构。


1. 单列索引


  • 普通索引:MySQL中最基本的索引类型,没有什么限制,允许定义索引的列中插入重复值和空值,纯粹就是为了查询数据更快一些;
  • 唯一索引:索引列中的值必须是唯一的,但是允许空值;
  • 主键索引:一种特殊的唯一索引,不允许有空值。

2. 组合索引

在表中的多个字段组合上创建的索引,遵循最左前缀原则。

最左前缀原则:使用组合索引时在查询条件中使用了这些字段的左边字段时,索引才会被使用。

回表:如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息。


3. 全文索引

全文索引只能在MyISAM存储中才能使用,而且只能在char、varchar、text 类型字段上才能使用。


三、索引的使用

 创建一个表用来做测试使用:

CREATE TABLE `user` ( `id` int(10) NOT NULL COMMENT '主键', `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', `age` tinyint(3) NULL DEFAULT NULL COMMENT '年龄', `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

1.  普通索引

CREATE INDEX indexName ON  tableName(columnName(columnLength))


例如: create index index_name on `user`(name(10))


 列的长度可以不写,但是创建索引时如果是blob 和 text 类型,必须指定length。


2. 唯一索引

CREATE UNIQUE INDEX indexName ON tableName(columnName(columnLength))


3.  全文索引

CREATE FULLTEXT INDEX indexName ON tableName(columnName(columnLength))

4.  联合索引

ALTER TABLE tableName add INDEX indexName (column1,column2,column3)

例如:ALTER TABLE `user`  add INDEX indexName (name,age,address)



5. 删除索引

DROP INDEX indexName ON  tableName;


例如:DROP INDEX index_name ON `user`



四、索引的存储结构


1. B Tree 和 B + Tree 的特点以及区别


  • 树的高度一般都是2-4层,树的高度会直接影响到 IO 读写的效率;
  • 如果是三层树结构,支撑的数据量可以达到 20G ,如果是4层树结构,支撑的数据可以达到几十 T;
  • B Tree 和 B+ Tree最大的区别就是非叶子接覅是否存储数据的问题:B Tree 是非叶子节点和叶子节点都会存储数据, B + Tree 只有叶子节点会存储数据,而且存储数据都是在一行上面,并且这些数据都是有指针指向的,也就是说是有顺序的。

2. 非聚集索引(MyISAM)


  • 叶子节点只会存储数据行的指针,简单来说数据和索引不在一起,就是非聚集索引;
  • 主键索引和辅助索引都会存储指针的值。

MySQL索引详解(聚集索引与非聚集索引以及数据结构)1


 

简单来讲:就是主键索引与辅助索引都是存储的是数据的指针,都是拿着指针去数据文件中找数据。


3. 聚集索引(InnoDB)


  • 主键索引(聚集索引)的叶子节点会存储数据行,也就是说数据和索引是在一起,这就是聚集索引。
  • 辅助索引只会存储主键值;
  • 如果没有主键,就会使用唯一索引建立聚集索引;如果没有唯一索引,MySQL会按照一定的规则创建聚集索引。

MySQL索引详解(聚集索引与非聚集索引以及数据结构)2

简单来讲:就是主键索引存储的是数据,在找到主键的时候就直接找到了数据,比较方便快捷;使用辅助索引的话存储的是主键的值,拿到主键的值,再去主键索引中找一下数据行。


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
U友50140932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有