首页 > 其他分享 >索引

索引

时间:2024-03-21 23:55:19浏览次数:22  
标签:COMMENT 存储 支持 索引 引擎 table

一、索引概述

索引是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。

优点:

  • 提高数据检索效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

缺点:

  • 索引列也是要占用空间的
  • 索引大大提高了查询效率,但降低了更新的速度,比如 INSERT、UPDATE、DELETE

二、索引结构

MySQL的索引实在存储引擎层实现的,不同存储引擎由不同的结构,主要包含一下几种:

索引结构描述
B+Tree 最常见的索引类型,大部分引擎都支持B+树索引
Hash 底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询
R-Tree(空间索引) 空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-Text(全文索引) 是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES

 

索引InnoDBMyISAMMemory
B+Tree索引 支持 支持 支持
Hash索引 不支持 不支持 支持
R-Tree索引 不支持 支持 不支持
Full-text 5.6版本后支持 支持 不支持

 

 

默认存储引擎是InnoDB。

找个例子看一下:

#查询account表的建表语句
show create table account;
#查询结果
CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `money` int DEFAULT NULL COMMENT '余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='账户表'

ENGINE=InnoDB 可以看到未指定存储引擎,默认存储引擎是InnoDB

如果创建表时候想指定存储引擎,ENGINE=XXXX就可以了。

可以通过 show engines; 查一下支持哪些存储引擎。

三、存储引擎的特点

区别

特点InnoDBMyISAMMemory
存储限制 64TB
事务安全 支持 - -
锁机制 行锁 表锁 表锁
B+tree索引 支持 支持 支持
Hash索引 - - 支持
全文索引 支持(5.6版本之后) 支持 -
空间使用 N/A
内存使用 中等
批量插入速度
支持外键 支持 - -

InnoDB

介绍: InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 引擎。

特点:

  • DML 操作遵循 ACID 模型,支持事务
  • 行级锁,提高并发访问性能
  • 支持外键约束,保证数据的完整性和正确性

文件: xxx.ibd: xxx代表表名,InnoDB 引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。

参数:innodb_file_per_table,决定多张表共享一个表空间还是每张表对应一个表空间

#查询表变量里的innodb_file_per_table开关
show variables like 'innodb_file_per_table';
查询结果是ON,打开的,打开就代表每张表对应一个表空间

我们可以打开mysql的数据存放目录
cd /var/lib/mysql/数据库名
看到"表名.ibd"
可以使用MySql8.0自带的工具ibd2sdi读取到ibd文件中的相关信息
如果mysql是docker安装的则先进入容器再找到指定文件:sudo docker exec -it 27e /bin/bash

 逻辑存储结构:

MyISAM

介绍: MyISAM 是 MySQL 早期的默认存储引擎。

特点:

  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快

文件:

  • xxx.sdi: 存储表结构信息(文本文件,可以直接打开看)
  • xxx.MYD: 存储数据
  • xxx.MYI: 存储索引
#创建一张表观察一下试试
CREATE TABLE `myisam_table` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试MyISAM'

#进入docker MySql容器
sudo docker exec -it 27e /bin/bash

#进入bian_test库文件夹下
cd /var/lib/mysql/bian_test
#可以看到如下三个文件
myisam_table.MYD  myisam_table.MYI  myisam_table_685.sdi 

Memory

介绍: Memory 引擎的表数据是存储在内存中的,受硬件问题、断电问题的影响,只能将这些表作为临时表或缓存使用。

特点:

  • 存放在内存中,速度快
  • hash索引(默认)

文件:

  • xxx.sdi: 存储表结构信息
#创建一张表观察一下试试
CREATE TABLE `memory_table` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=Memory DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试Memory'

#进入docker MySql容器
sudo docker exec -it 27e /bin/bash

#进入bian_test库文件夹下
cd /var/lib/mysql/bian_test
#可以看到如下文件
memory_table_686.sdi

四、怎么选择存储引擎

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

  • InnoDB: 如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,则 InnoDB 是比较合适的选择
  • MyISAM: 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那这个存储引擎是非常合适的。
  • Memory: 将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。Memory 的缺陷是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性

电商中的足迹和评论适合使用 MyISAM 引擎,缓存适合使用 Memory 引擎。

标签:COMMENT,存储,支持,索引,引擎,table
From: https://www.cnblogs.com/cheng8/p/18088516

相关文章

  • MySQL 索引:索引为什么使用 B+树?
    Hash索引不支持顺序和范围查询;二叉查找树(BST):解决了排序的问题,极端情况下可能会退化成线性链表,查询效率急剧下降;平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低; AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1红黑树:通过舍弃严格的平......
  • 深入浅出mysql索引
    了解mysql是一个关系型数据库,mysql默认的最大链接数为151,一条语句的执行过程主要为:词法解析->语法解析->预处理器->优化器->执行器,这么一个流程。oracle中的sql执行流程(了解),oracle中采用了共享池来判断sql中是否存在缓存和执行计划,通过这一步骤我们可以知道应当采......
  • 倒排索引关键点普及
     倒排索引倒排索引是什么?为什么es、hbase、doris、starrocks都有倒排索引?倒排索引(英文:InvertedIndex),是一种索引方法,常被用于全文检索系统中的一种单词文档映射结构。现代搜索引擎绝大多数的索引都是基于倒排索引来进行构建的,这源于在实际应用当中,用户在使用搜索引擎查找信息......
  • MySQL 索引的10 个核心要点
    文章目录......
  • [数组练习题]二分法查找操作实例:使用二分法查找有序数组中元素。 找到返回索引,不存在
    文章目录题干一、题目分析1.定义数组,用于后续在数组中查找元素2.对数组进行排序3.定义方法4.调用方法,打印输出二、代码1.代码块2.一图流总结题干提示:这段是题干,仔细阅读仔细分析:二分法查找操作:使用二分法查找有序数组中元素。找到返回索引,不存在输出-1。......
  • 索引类型及其应用场景与作用
    索引是数据库管理系统中用于加快数据检索速度的一种数据结构。不同类型的索引适用于不同的应用场景,下面将详细介绍几种常见的索引类型及其作用。1.B树索引应用场景:当数据表的数据量较大时。对于经常需要进行等值比较的查询操作。作用:B树索引通过平衡树结构,减少数据检索......
  • openGauss Index-advisor_索引推荐
    Index-advisor:索引推荐可获得性本特性自openGauss1.1.0开始引入。特性简介Index-advisor工具是一个覆盖多种任务级别和使用场景的数据库智能索引推荐工具,其具备单Query索引推荐功能、虚拟索引功能、workload级别索引推荐功能,可以为用户提供可靠的索引建议。客户价值为客户提......
  • 数据库查询优化:解析不使用索引的场景及对策
    数据库索引的目的是为了加快查询速度,但在某些情况下,查询可能不会使用索引,即所谓的“不走索引”。以下是一些可能导致数据库查询不使用索引的情况:全表扫描:当查询条件中的字段没有建立索引,或者查询的条件是对整个表进行范围查询(如使用 BETWEEN),数据库可能会选择全表扫描而不是使......
  • mysqly索引(explain 执行计划)
    关键词执行计划EXPLAIN+语句查看mysql优化后的语句showwarnings;EXPLAIN执行后,各列的含义要点:select_type如何查询表type如何查询行key如何使用索引key_len索引使用多少rows行预计使用多少extra表的额外信息1.idid列的编号是select的序列号......
  • MySQL系列:索引失效场景总结
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......