继续整理复习、我以我的理解和认知来整理 "索引" 会通过 文 和 图 来展示。
文: 基本概念知识(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
文件存储索引
-
事务支持:
- InnoDB:支持事务,是一个事务安全的存储引擎。它遵循 ACID(原子性、一致性、隔离性和持久性)属性,可以保证数据的完整性和一致性。
- MyISAM:不支持事务,不提供数据的回滚和恢复功能。如果发生故障,可能导致数据不一致。
-
行级锁定:
- InnoDB:支持行级锁定,可以在并发访问时更好地处理读写冲突,提供更高的并发性能。
- MyISAM:只支持表级锁定,这意味着在进行写操作时,整个表都会被锁定,可能导致并发性能较差。
-
外键约束:
- InnoDB:支持外键约束,可以在表之间建立关联关系,保持数据的完整性。
- MyISAM:不支持外键约束,无法建立关联关系。
-
全文搜索:
- InnoDB:不支持全文搜索。
- MyISAM:支持全文搜索,可以在文本字段上进行高效的全文搜索操作。
-
崩溃恢复:
- InnoDB:支持崩溃恢复,具有更好的数据安全性和可靠性。
- MyISAM:不支持崩溃恢复,如果在写入数据时发生崩溃,可能导致数据丢失或损坏。
-
表的大小限制:
- 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索引的基础知识:
-
索引的作用:索引可以提高数据库查询的速度,特别是在大型数据表中。它可以加快WHERE条件的过滤、排序操作和连接操作的速度。
-
索引的类型:MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,最常用的是B树索引,它适用于范围查询和精确查询。
-
主键索引:主键索引是一种唯一索引,用于标识表中的每一行。它可以加速通过主键进行数据访问的操作。
-
唯一索引:唯一索引要求索引列的值唯一,用于确保数据的完整性。它类似于主键索引,但允许空值。
-
普通索引:普通索引是最常见的索引类型,没有唯一性限制。它可以加速查询和排序操作。
-
复合索引:复合索引是由多个列组成的索引,可以加速涉及到这些列的查询。在使用复合索引时,查询条件中的列顺序很重要。
-
前缀索引:前缀索引是指对索引列的一部分进行索引,而不是整个列。它可以减小索引的大小,提高查询性能,但可能会降低索引的选择性。
-
索引的创建和管理:可以使用CREATE INDEX语句在表上创建索引。可以使用ALTER TABLE语句添加、删除或修改索引。定期对索引进行优化和重建可以提高索引性能。
-
索引的优缺点:索引可以提高查询性能,但同时也会占用磁盘空间和增加写操作的开销。因此,在创建索引时需要权衡查询性能和数据修改的成本。
-
注意事项:在使用索引时需要注意选择合适的列作为索引列,避免创建过多或不必要的索引。索引的选择性和列的数据类型也会影响索引的效果。
小结:
了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助。
比如:
1、为什么不建议使用过长的字段作为主键
知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键
,因为所有二级索引都引用主键索引,过长的主键索引会令二级索引变得过大。
2、为什么建议使用增长的数字类型作为主键
用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一棵B+Tree,非单调的主键会造成在插入新记录时,数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择
。
3、索引失效
现在回顾上一章所写的
mysql(一) 使用注意事项及优化_mysql使用注意事项_DJyzh的博客-CSDN博客
文章里面说会导致索引失效、今天看完索引的结构是否有帮助。 这里面具体的案例我们后面遇到了再具体的去解释。
还有 普通索引、复合索引的图我们在下一篇再写、知道的越多、你不知道的越多、让我们一起学习。