首页 > 数据库 >MySQL 学习笔记 进阶(存储引擎,索引上)

MySQL 学习笔记 进阶(存储引擎,索引上)

时间:2024-07-25 16:17:47浏览次数:11  
标签:存储 hash 进阶 tree 索引 引擎 MySQL

存储引擎

 

存储引擎-MySQL体系结构

  • 连接层
  • 服务层
  • 引擎层
  • 存储层

 

存储引擎-简介

  • 简介:存储引擎就是存储数据、建立索引、更新/ 查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被成为表类型。
  • 在创建表时,指定存储引擎
CREATE TABLE 表名 (
    字段1 字段1类型 [COMMENT 字段1注释],
    ......
    字段n 字段n类型 [COMMENT 字段n注释]
) ENGINE = INNODB [COMMENT 表注释];
  • 查看当前数据库支持的存储引擎
SHOW ENGINES;

 

存储引擎-InnoDB介绍

  •  介绍

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

  • 特点

    · DML操作遵循ACID模型,支持事务;

    · 行级锁,提高并发访问性能;

    · 支持外键 FOREIGN KEY约束,保证数据的完整性和正确性;

  • 文件

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

    参数:innodb_file_per_table

  • 逻辑存储结构

 

存储引擎-MyISAM

  • 介绍

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

  • 特点

    · 不支持事务,不支持外键

    · 支持表锁,不支持行锁

    · 访问速度快

  • 文件

    xxx.sdi:存储表结构信息

    xxx.MYD:存储数据

    xxx.MYI:存储索引

 

存储引擎-Memory

  • 介绍

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

  • 特点

    · 内存存放

    · hash索引(默认)

  • 文件

    xxx.sdi:存储表结构信息

 

存储引擎-存储引擎特点

 

存储引擎-选择

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

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

 

索引

 

索引-概述

  • 介绍

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

  • 优缺点

 

索引-结构

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

 

 我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

 

索引-结构-Btree

  • 二叉树

二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量的情况下,层级较深,检索速度慢。

红黑树:大数据量情况下,层级较深,检索速度慢。

  • B-Tree(多路平衡查找树)

以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):

 树的度数指的是一个节点的子节点数量。

 

索引-结构-B+tree

以一颗最大度数(max-degree)为4(4阶)的b+tree为例:

 

  • 相对于B-tree的区别

    · 所有的数据都会出现在叶子节点

    · 叶子节点形成一个单向链表

  • MySQL索引数据结构对经典的B+tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高了区间访问的性能。

 

 

索引-结构-hash

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。

如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

  •  Hash索引特点

    · Hash索引只能用于对等比较(=, in),不支持范围查询(between, >, <, ...)

    · 无法利用索引完成排序操作

    · 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引

  • 存储引擎支持

    在MySQL中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+tree索引在指定条件下自动构建的。

 

思考:为什么InnoDB存储引擎选择使用B+tree索引结构?

  • 相对于二叉树,层级更少,搜索效率高;
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
  • 相对于Hash索引,B+tree支持范围匹配及排序操作;

标签:存储,hash,进阶,tree,索引,引擎,MySQL
From: https://www.cnblogs.com/handsome-zyc/p/18322585

相关文章

  • 第九讲: MySQL为什么有时候会选错索引?
    第九讲:MySQL为什么有时候会选错索引?​ 前面我们介绍过索引,你已经知道了在MySQL中一张表其实是可以支持多个索引的。​ 但是,你写SQL语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由MySQL来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快......
  • MySQL篇
    一、定位慢查询定位慢查询很简单,主要有以下方式:通过运维工具分析开启mysql慢日志在mysql的配置文件/etc/my.cnf中配置并开启慢日志功能#开启MySQL慢日志查询开关slow_query_log=1#设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志long_quer......
  • mysql常用语法
    MySQL约束注释--单行注释/*多行注释*/#井号注释MySQL命令执行顺序FROM>ON>JOINWHERE>GROUPBY>HAVING+聚合函数>SELECT>ORDERBY>LIMIT数据库设计——DDLshowdatabases; --查看当前所有的数据库use[数据库名]; --打开指定的数据库showtab......
  • 第八讲:普通索引和唯一索引,应该怎么选择?
    目录第八讲:普通索引和唯一索引,应该怎么选择?日常日常开头:日常提问:查询过程:日常答案更新过程不同索引的更新第一种情况是,这个记录要更新的目标页在内存中。第二种情况是,这个记录要更新的目标页不在内存中。一个更新事故:changebuffer的使用场景索引选择和实践changebuffer和redo......
  • Mysql常用函数
    1、FIND_IN_SETFIND_IN_SET()是一个MySQL中的字符串函数,用于在一个由逗号分隔的字符串列表中查找指定字符串的位置。如果找到了指定的字符串,FIND_IN_SET()将返回该字符串在列表中的位置(索引值)。如果没有找到,它将返回0。其语法如下:FIND_IN_SET(str,strlist)str:......
  • Mysql 函数 (进阶介绍 八)
    目录MySQLCURTIME()函数定义和用法语法实例MySQLDATE()函数定义和用法语法实例MySQLEXTRACT()函数定义和用法语法实例MySQL字符串连接CONCAT()函数使用方法:MySQL字符串截取SUBSTRING()函数 使用方法:MySQL数学函数使用方法:mysqlsubstr()函数截......
  • 一文了解MySQL索引机制
    接触MySQL数据库的小伙伴一定避不开索引,索引的出现是为了提高数据查询的效率,就像书的目录一样。某一个SQL查询比较慢,你第一时间想到的就是“给某个字段加个索引吧”,那么索引是什么?是如何工作的呢?一起静下心来,耐心看完这篇文章吧,干货不啰嗦,相信你一定会有所收获。一、索引模型模......
  • Mysql中修改新创建用户的密码
    创建新用户时,新用户没有权限,所以自己无法修改成简单的密码(1)可以通过root用户给权限,让新用户自己修改:1.先进入root用户,mysql-uroot-p1234562.给新用户权限:grantallprivilegeson.to'新用户名'@'localhost'withgrantoption;(其中withgrantoption是让新用户......
  • SpringBoot + MyBatis 实现 MySQL 主从复制动态数据源切换
    概述在项目中的某些场景中,需要对数据库进行一些优化。常用的有如下的实现方法:读写分离、引入缓存技术、主从复制、分库分表等。今天来简单介绍一些如何在程序中实现动态切换数据源,可能某台服务器性能比较好,让流量多的方法执行切换到此数据源去操作等等。当然这种思想也可以扩展......
  • MySql数据表创建并新增数据
    --------------------------------Tablestructureforbs002h------------------------------DROPTABLEIFEXISTS`bs002h`;CREATETABLE`bs002h`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`cr_time`datetime(6)NOTNULL,`rg_time`datetime(6)NOT......