mysql数据库引擎

2023-05-16


一、innodb

1.支持事务
事务ACID(atomicity原子性、consistency一致性、isolation隔离性、durability持久性)
A:事务要么全执行,要么全不执行
C:事务执行前后,数据完整性一致
I:多用户并发访问数据库时,数据库为每个用户创建的事务间相互隔离
D:事务一旦被提交,对数据库中数据的改变就是持久的
四个隔离级别
1)Read uncommitted(最低级别)
脏读:事务A读取了事务B未提交的数据,事务B却回滚了。
2)Read committed (可避免脏读)
不可重复读:针对其他事务提交前后,读取数据本身的对比不同,(记录的修改)
3)Repeatable read(避免脏读,不可重复读)
幻读:针对其他事务提交前后,读取的记录的条数不同(记录的增删)
4)Serializable(最高级别,可避免脏读,不可重复读,幻读)

2.支持行级锁定:
仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作

3.存储
基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,
InnoDB 表的大小只受限于操作系统文件的大小

4.索引组织表
使用的聚簇索引、索引就是数据,顺序存储,因此能缓存索引,也能缓存数据
5.服务器数据备份
必须导出SQL来备份,
LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,
解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,
但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
6.使用场景
需要事务支持(具有较好的事务特性)
行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
经常更新的表,适合处理多重并发的更新请求
数据一致性要求较高
硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
主键尽可能小,避免给Secondary index带来过大的空间负担
避免全表扫描,因为会导致锁表。(sql语句中含有where条件同时明确主键)
尽可能缓存所有的索引和数据,提高响应速度
在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
避免主键更新,因为这会带来大量的数据移动
7.引擎原理


二、MyISAM
1.管理非事务表,提供高速存储和检索,以及全文搜索能力
2.支持表级锁定:
直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。
如果你是写锁(X锁,排他锁),则其它进程则读也不允许直接锁定整张表,
3.存储
索引和数据是分开的,并且索引是有压缩的。
在磁盘上存储成三个文件。
.frm文件用于存储表的定义,
.MYD文件用于存储表的数据,
.MYI文件,存储的是索引。
操作系统对大文件的操作是比较慢的,这样将表分为三个文件,
那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。
有索引管理和字段管理。
4.堆组织表
使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引
5.服务器数据备份
应对错误编码导致的数据恢复速度快。
MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。
在备份和恢复时可单独针对某个表进行操作
6.使用场景
不需要事务支持(不支持)
并发相对较低(锁定机制问题)
插入修改不频繁,查询非常频繁
数据一致性要求不是非常高
尽量索引(缓存机制)
调整读写优先级,根据实际需求确保重要操作更优先
启用延迟插入改善大批量写入性能
尽量顺序操作让insert数据都写入到尾部,减少阻塞
分解大的操作,降低单个操作的阻塞时间
降低并发数,某些高并发场景通过应用来进行排队机制
对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率
MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问
7.引擎原理






三、其他
1.如果需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
2.mysql支持三种锁定级别,行级、页级、表级




四、Innodb和MyIASM的引擎原理

1、Innodb

引擎的索引结构,使用B+Tree作为索引结构。
InnoDB的数据文件本身就是索引文件,数据文件本身就是按B+Tree组织的一个索引
结构,这棵树的叶节点data域保存了完整的数据记录,这种索引就是聚集索引。

主键索引:
a、因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)。b、如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键。

c、如果不存在唯一标识数据记录的列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。


辅助索引
InnoDB的辅助索引data域存储相应记录主键的值而不是地址即InnoDB的所有辅助索引都引用主键作为data域


2、MyIASM

引擎的索引结构:使用B+Tree作为索引结构
MyISAM索引实现:
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址,即叶节点的data域存放的是数据记录的地址

索引检索的算法:
首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

主键索引和辅助索引(结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复)

3、注意

对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在
MyISAM表中,可以和其他字段一起建立联合索引。

InnoDB 中不保存表的具体行数,也就是说,执行select count() fromtable时,
InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行

数即可。注意的是,当count()语句包含where条件时,两种表的操作是一样的


来源:https://m.ifeng.com/miArticle?ch=ref_xmllq_hz1&version=2&aid=ucms_7q7rbVyL69F&mibusinessId=miuibrowser&env=production&ref=browser_news&s=mb&cp=cn-fenghuang-browser&docid=fenghuang_ucms_7q7rbVyL69F&itemtype=news&_miui_bottom_bar=comment&cateCode=rec&category=%E7%A7%91%E6%8A%80&traceId=69EFF0D29A24F938C25321831ABE59B6&share=social&source=liulanqi

转载于:https://www.cnblogs.com/mznsndy/p/11601426.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql数据库引擎 的相关文章

  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希

随机推荐

  • 如何改善GPS的漂移?

    GPS飘移一直以来都是令用户和厂家比较头疼的问题 xff0c 也是很多用户选择GPS的首选指标 xff0c 好的产品定位精准 xff0c 漂移很小 xff0c 那么如何改善GPS的漂移 xff1f 1 xff09 纯软件方法 通过软件滤波算
  • Proteus仿真与实际的差别

    最近刚做好一个站 xff0c 基于rails 3 xff0c 教程为主 xff0c 大家捧场看看 xff0c 谢谢 xff01 www yo945 com 弄了几天的Proteus仿真 xff0c 终于觉得自己想做的东西 xff0c 已经全
  • 串口调试助手-打开报错

    问题 xff1a 串口调试助手sscom33打开报错 xff0c 报错信息如下图 解决方法 xff1a 1 将串口设备连接到电脑 1 xff09 若是台式机 xff0c 则直接用串口线连接电脑和串口设备 2 xff09 若是笔记本电脑 xf
  • 基于变分自编码器(VAE)利用重建概率的异常检测

    本文为博主翻译自 xff1a Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability xff0c 如侵立删 http d
  • 让Eclipse的自动提示更加智能

    ddd在Eclipse MyEclipse的默认设置中 xff0c 只有输入一个点号后才自动提示 xff0c 不太友好 xff0c 我们把他修改一下 xff0c 只要输入字母就有提示 Windows Preferences Java Edi
  • 驱动的本质

    驱动的本质 参考 xff1a www zhihu com question 33 2 驱动程序的本质 xff01 CPU要与IO模块传送数据 xff0c 要编程 xff0c 这个与IO模块传送数据的程序就是 34 驱动程序 34 驱动程序的
  • c语言中变量/函数命名以单下划线(_)和双下划线(__) 开头的意义

    以单下划线 xff08 xff09 表明是标准库的变量 双下划线 xff08 xff09 开头表明是编译器的变量 建议自己在命名的时候不要用下划线开头 xff0c 避免与标准库中的命名冲突 命名方法有好多 xff0c 何必为自己找不自在呢
  • PADS9.5 原理图和封装制作——以STM32F103为例

    1 进入元件编辑有两种方法 xff0c 第一种 xff1a 文件 库 第二种 xff1a 工具 元件编辑器 2 选定你要保存的库 xff0c 选择元件 xff0c 按新建按钮 3 选择下面按钮进入编辑界面 xff0c 如果是建的新库里面没有
  • 转载:Pixhawk源码笔记一:APM代码基本结构

    转自 新浪微博 64 WalkAnt 基础知识 详细参考 xff1a http dev ardupilot com wiki learning the ardupilot codebase 第一部分 xff1a 介绍 详细参考 xff1a
  • Python startswith()函数 与 endswith函数

    函数 xff1a startswith 作用 xff1a 判断字符串是否以指定字符或子字符串开头 一 函数说明 语法 xff1a string startswith str beg 61 0 end 61 len string 或strin
  • [C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)

    一 前言 博主最近在LeetCode上用C 43 43 练习 一路走来踩过一些坑 xff0c 做了一些总结和笔记 xff0c 分享给需要的人 LeetCode中文版 xff1a https leetcode cn com 二 介绍 Leet
  • Win10加装SSD固态硬盘后卡顿现象的解决方法

    现象 xff1a 1 不定期出现卡顿 xff0c 或开机直接卡顿 xff0c 移动鼠标一下一下卡顿 xff0c 听歌曲看视频亦是一下一下卡顿 xff0c 非假死或死机 2 硬盘占用率正常 xff0c CPU占用率正常 xff0c 内存占用率
  • PX4/Pixhawk---高速成为开发人员(Windows)

    1 高速成为开发人员新手教程 xff08 翻译 xff09 官方 1 1 编译环境之版本号控制系统 xff08 1 xff09 安装 MSysGIT 安装完毕后 xff0c 配置GIT 安装注意 安装过程中除了以下一步外 xff0c 其它的
  • iOS 变量名前为什么要加_下划线

    简单来说 xff0c 含有两个下划线和下划线 43 大写字母开头的标识符是给编译器和标准库用的 xff0c 你不能用 xff0c 否则后果自负 一个下划线开头的随便用 xff0c 只要你不嫌麻烦 而我们一般在前面加 表示私有变量 一般来说
  • VINS-mono详细解读

    VINS mono详细解读 极品巧克力 前言 Vins mono是香港科技大学开源的一个VIO算法 xff0c https github com HKUST Aerial Robotics VINS Mono xff0c 是用紧耦合方法实现
  • 从阿里到微店

    从阿里到微店 标签 xff1a 程序人生 在 lt 2 5年 从0到阿里 gt 中提到过 当时面阿里云OS时预期的是进入虚拟机团队 结果后来被分到了高通平台参考设计团队 因此在阿里期间心情一直是比较低落的 写这篇博客主要是基于以下几个原因
  • 旷视研究院Detection组负责人

    http www skicyyu org https zhuanlan zhihu com p 61910297 俞刚 xff0c 旷视研究院Detection组负责人 2014年博士毕业于新加坡南洋理工大学 xff0c 加入旷视 主要负责
  • FIFO队列(First In First Out)和优先队列

    queue lt 类型名 gt q q size 返回队列中元素个数 q empty 若队列为空 xff0c 返回true xff0c 否则返回false q pop 删除队首元素 xff0c 但不返回其值 q front 返回队首元素的值
  • profile, bashrc, source, setup.*sh

    一 source xff1a 命令是使该文件立刻执行 xff0c 这样刚才做的修改就可以立即生效了 xff0c 否则要重新启动系统修改才能生效 执行其后命令使之立即生效 xff0c 不用重启 二 bashrc 1 linux系统 xff1a
  • mysql数据库引擎

    一 innodb 1 支持事务 事务ACID atomicity原子性 consistency一致性 isolation隔离性 durability持久性 A xff1a 事务要么全执行 xff0c 要么全不执行 C xff1a 事务执行前