mysql(二) 索引-基础知识

chatgpt/2023/10/4 7:04:56

继续整理复习、我以我的理解和认知来整理 "索引" 会通过 来展示。

文: 基本概念知识(mysql 的索引分类、实现原理)

图: 画B+树等

MySQL官方对索引的定义是:索引(Index)是帮助MySQL高效获取数据的数据结构。索引最形象的比喻就是图书的目录。注意只有在大量数据中查询时索引才显得有意义。
在MySQL中索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。常见的索引分类如下:
按数据结构分类:B+tree索引、Hash索引、Full-text索引。
按物理存储分类:聚集索引非聚集索引(也叫二级索引、辅助索引)。
按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。
按字段个数分类:单列索引联合索引(也叫复合索引、组合索引)。

目录

引擎InnoDB与MyISAM的区别

事务支持:

行级锁定:

外键约束:

全文搜索:

崩溃恢复:

表的大小限制:

索引的"样子"

模拟B+Tree的数据 图

InnoDB(结合数据)图

MyISAM(结合数据)图

索引的基础知识

小结:

1、为什么不建议使用过长的字段作为主键

2、为什么建议使用增长的数字类型作为主键

3、索引失效


引擎InnoDB与MyISAM的区别

存储文件类型:

        InnoDB:InnoDB 存储引擎使用表空间文件进行数据存储。每个表都有一个单独的 .ibd 文件用于存储数据和索引。

查看地址(适配自己的版本和路径):C:\ProgramData\MySQL\MySQL Server 5.6\data\  

MyISAM:MyISAM 存储引擎使用三种文件来存储数据:.frm 文件存储表的定义,.MYD 文件存储数据,.MYI 文件存储索引

  1. 事务支持:

    • InnoDB:支持事务,是一个事务安全的存储引擎。它遵循 ACID(原子性、一致性、隔离性和持久性)属性,可以保证数据的完整性和一致性。
    • MyISAM:不支持事务,不提供数据的回滚和恢复功能。如果发生故障,可能导致数据不一致。
  2. 行级锁定:

    • InnoDB:支持行级锁定,可以在并发访问时更好地处理读写冲突,提供更高的并发性能。
    • MyISAM:只支持表级锁定,这意味着在进行写操作时,整个表都会被锁定,可能导致并发性能较差。
  3. 外键约束:

    • InnoDB:支持外键约束,可以在表之间建立关联关系,保持数据的完整性。
    • MyISAM:不支持外键约束,无法建立关联关系。
  4. 全文搜索:

    • InnoDB:不支持全文搜索。
    • MyISAM:支持全文搜索,可以在文本字段上进行高效的全文搜索操作。
  5. 崩溃恢复:

    • InnoDB:支持崩溃恢复,具有更好的数据安全性和可靠性。
    • MyISAM:不支持崩溃恢复,如果在写入数据时发生崩溃,可能导致数据丢失或损坏。
  6. 表的大小限制:

    • InnoDB:没有表的大小限制,支持大型表。
    • MyISAM:对表的大小有限制,通常最大为 4GB。

索引的"样子"

模拟B+Tree的数据 图

        推荐数据结构模拟的网站:B+ Tree Visualization 可以自己试试、可以模拟、插入、删除、查询等。(注意Max. Degree = 3

  

InnoDB(结合数据)图

         InnoDB的索引文件本身就是数据文件,即B+Tree的数据域存储的就是实际的数据.

         先建一张 user表 (只有简单的三个字段)

CREATE TABLE `user` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(50) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '姓名',`age` int(4) NOT NULL DEFAULT '0' COMMENT '年龄',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

        再批量插入数据

insert user(name,age) VALUES("张三",10),("张四",11),("王五",12),("王六",10),("杨六",11);

  数据已经有了、那么在B+Tree中数据是则么存放的呢。(这是主键索引)

索引及数据都是存在叶子节点中的,默认的节点大小是16kb

innodb 默认的一页大小为 16384B = 16384/1024 = 16kb

 注意我们演示和画的图片是以 Max. Degree = 3 来画的。实际数据库应用则是16kb。图片也可以让我们看到页与页之间的联系、这个我们以后聊先 看看数据如何具体存放。

MyISAM(结合数据)图

MyISAM的索引方案虽然也使用树形结构,但是却将索引和数据分开存储。同样也是一棵B+Tree,data域保存数据记录的地址。

将表中的记录按照记录的插入顺序单独存储在一个文件中,称之为数据文件。 即.MYD文件

使用MyISAM存储引擎的表会把索引信息另外存储到一个称为索引文件的另一个文件。.MYI文件

索引的基础知识

下面是一些关于MySQL索引的基础知识:

  1. 索引的作用:索引可以提高数据库查询的速度,特别是在大型数据表中。它可以加快WHERE条件的过滤、排序操作和连接操作的速度。

  2. 索引的类型:MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,最常用的是B树索引,它适用于范围查询和精确查询。

  3. 主键索引:主键索引是一种唯一索引,用于标识表中的每一行。它可以加速通过主键进行数据访问的操作。

  4. 唯一索引:唯一索引要求索引列的值唯一,用于确保数据的完整性。它类似于主键索引,但允许空值。

  5. 普通索引:普通索引是最常见的索引类型,没有唯一性限制。它可以加速查询和排序操作。

  6. 复合索引:复合索引是由多个列组成的索引,可以加速涉及到这些列的查询。在使用复合索引时,查询条件中的列顺序很重要。

  7. 前缀索引:前缀索引是指对索引列的一部分进行索引,而不是整个列。它可以减小索引的大小,提高查询性能,但可能会降低索引的选择性。

  8. 索引的创建和管理:可以使用CREATE INDEX语句在表上创建索引。可以使用ALTER TABLE语句添加、删除或修改索引。定期对索引进行优化和重建可以提高索引性能。

  9. 索引的优缺点:索引可以提高查询性能,但同时也会占用磁盘空间和增加写操作的开销。因此,在创建索引时需要权衡查询性能和数据修改的成本。

  10. 注意事项:在使用索引时需要注意选择合适的列作为索引列,避免创建过多或不必要的索引。索引的选择性和列的数据类型也会影响索引的效果。

小结:

了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助。

比如:

1、为什么不建议使用过长的字段作为主键

        知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有二级索引都引用主键索引,过长的主键索引会令二级索引变得过大。


2、为什么建议使用增长的数字类型作为主键

用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一棵B+Tree,非单调的主键会造成在插入新记录时,数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择

3、索引失效

现在回顾上一章所写的

mysql(一) 使用注意事项及优化_mysql使用注意事项_DJyzh的博客-CSDN博客

文章里面说会导致索引失效、今天看完索引的结构是否有帮助。 这里面具体的案例我们后面遇到了再具体的去解释。

还有 普通索引、复合索引的图我们在下一篇再写、知道的越多、你不知道的越多、让我们一起学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5314073.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

【链表分割(牛客网)(和答案一样的写上去但是就是通过不了你试一试)】

链表分割 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 /* struct ListNode {int val;struct ListNode *next;ListN…

死锁产生的原因以及解决方案

一.原因: 1.使用互斥锁. 2.除非主动释放,负责不能被抢占. 3.占用一把锁不释放,等待其它锁资源(保持现状). 4.锁形成环路. 二.解决方案: 给锁编号,上锁的时候从小到大依次上锁,譬如如果一个线程要上1号和2号两把锁,如果1号锁被占用,不能上2号锁,等其它线程释放1号锁资源后…

543. 二叉树的直径

题目 题解一 遍历每一个节点,以每一个节点为中心点计算最长路径(左子树边长右子树边长),更新全局变量max。 class Solution {int maxd0;public int diameterOfBinaryTree(TreeNode root) {depth(root);return maxd;}public int …

【ChatGLM_01】ChatGLM2-6B本地安装与部署(大语言模型)

基于本地知识库的问答 1、简介(1)ChatGLM2-6B(2)LangChain(3)基于单一文档问答的实现原理(4)大规模语言模型系列技术:以GLM-130B为例(5)新建知识库…

FitBot-一款先进的以健康为中心的聊天机器人

在健康意识高涨,追求均衡生活方式成为普遍追求的时代,营养问题无疑是核心支柱。然而,饮食计划的复杂性和大量的营养数据往往成为我们实现这种平衡的障碍。例如糖尿病患者,他们需要持续和准确的营养指导来有效管理血糖水平。如果能…

时间计算:时间戳加减指定的分钟数__Niyyy_记

在开发中多多少少会遇到时间的计算,以下只是一个简单的例子。 将时间戳加减指定的分钟数,并将结果转换为年月日时分秒格式: function addMinutes(timestamp, minutes) {var date new Date(timestamp);date.setTime(date.getTime() minute…

九五从零开始的运维之路(其二十八)

文章目录 前言一、概述二、用户权限类型三、用户赋权四、权限删除五、用户删除六、刷新权限:七、修改用户密码总结 前言 本篇将简述的内容:Linux系统下的MySQL服务用户权限管理 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&#xff…

Python实现GA遗传算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世…
推荐文章