高性能MySQL(3th)(第一章 MySQL概述) —— 04 InnoDB和MyISAM

MySQL事务底层原理与实战避坑指南 事务是数据库保障数据一致性的核心机制,其本质是通过锁(Lock)、多版本并发控制(MVCC)、undo log回滚和redo log持久化等技术协同实现ACID特性。不同隔离级别(如READ COMMITTED与REPEATABLE READ)在快照生成时机、间隙锁行为及幻读表现上存在根本差异;而InnoDB与PostgreSQL等引擎对事务的实现逻辑迥异,导致相同SQL语义下锁机制与一致性效果截然不同。理解事务不能停留在@Transactional注解或BEGIN/COMMIT语法层面,必须深入存储引擎执 阅读详情

一 InnoDB和MyISAM存储方式

聚簇 VS 非聚簇

InnoDB采用聚簇索引的方式存储数据,即主键索引(若没有设置unique索引则InnoDB会默认给主键创建索引)和数据一起存储,或者说,表中的数据是在内存中是按照主键索引的递增顺序组织存储的。对于InnoDB,一条sql如果筛选条件中主键索引成功生效并且返回字段就是索引字段,则InnoDB会直接查询数据文件,在叶子节点即可拿到数据。

而MyISAM则采用了非聚簇索引的方式,将原始数据和索引(任何)分为不同的文件独立存储,一条sql不管筛选条件利用了什么索引,MyISAM都要先查索引文件,再回数据文件相应位置取数据。

为了更加深入理解,想一下InnoDB下为一张表添加索引(非主键索引),此时这个索引文件必然是单独存储的,此时索引和数据就是独立存储的。一般情况下,一条sql如果筛选条件成功让索引生效,则InnoDB会先查索引文件,拿到该符合条件记录的id(主键)后,根据id再回数据文件进行一次select where id = xxx。

但是,如果建立的是组合索引(叶子节点不仅有id,还有组合索引的这几列数据),查询也成功地进行了覆盖查询,则直接拿着叶子上的列值返回,不用回主表查询了。

这里也可以看到,InnoDB的索引的B+树的叶子上存储的是该条件下的记录在主数据文件中的内存地址,而InnoDB索引的B+树叶子上存储的要么是完整记录行(主键索引),要么建立该索引使用的列值+主键id(这也提示我们不能InnoDB下不能加你个主键设置得过大)。

上面说的只是逻辑上的概念,实际在实现中,MyISAM有三个文件:表结构定义文件,数据文件,索引文件。

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

InnoDB要分情况讨论,表结构定义文件 + 数据索引文件

二 主键,外键

InnoDB必须要有主键,MyISAM可以没有,理由也很清楚:InnoDB的数据必须要按照主键索引组织存储,InnoDB下如果没有设定主键或者非空唯一索引,其会自动生成一个6字节的主键(用户不可见)。

前者支持外键,后者不支持。

三 事务,锁粒度

InnoDB支持外键,事务,支持行级锁(默认锁级别),MyISAM不支持外键,事务,只支持表级锁。

四 数据压缩,count

对于只读的表,MyISAM可以使用myisam命令进行数据压缩,更加节省空间;专门的变量存储当前表的记录数目,即count (*)是常数级别的,这两点InnoDB都没有,count(*)要扫描全表。

五 并发场景下怎么选择

先给结论:select和update时,MyISAM更快。

MySQL 中 MyISAM 中的查询为什么比 InnoDB 快

总结一下即;

① 非主键索引时,InnoDB要走2次B+树,MyISAM只有一次。

② 查询InnoDB的主表(不管使用的索引是不是主键索引,最后一步都要回主表,走主键索引),必须要进行大量的I/O将磁盘中的数据调入内存。

而对于这两点,MyISAM都不存在,由于索引和文件是独立存储的,不管利用了什么索引,MyISAM只需要先查索引文件(很小,一次性调用内存),找到叶子上对应的物理地址后,去数据文件中拿数据即可。可以说,总是常数级别的。

如果更加深入地理解这一点,看下图:

参考资料:like索引查询--mysql索引

即InnoDB下,对于MySQL的主键索引而言,从根到叶子路径上的每个节点都是一个16K大小的数据页,需要进行树高大小的磁盘I/O,注意,因为MySQL使用的是聚簇索引,意味着无论使用主键索引还是其他索引进行查找时,最后都必然要走这个过程。

而MyISAM索引类似于InnoDB下非主键索引查找的第一阶段,仅仅需要查找索引B+树即可,由于叶子上没有多少数据,甚至可以一次性将索引调入内存进行查找(一次磁盘I/O),而不像MySQL一样由于数据页固定大小——16K,所以必然要多次I/O。

③ InnoDB要维护MVCC,虽然select不用维护主键和B+树,但是对于每一行的是否符合条件的判断时都要检查MVCC的创建版本号和删除版本号,至少保证:

A.当前事务的版本号 > 该行的创建版本号——该行已经被创建,并且被其他事务修改;

B.当前事务的版本号 < 该行的删除版本号——操作时,该行还未被删除。

很明显,这些原因会导致InnoDB会MyISAM查询慢。

这也引出一个应用场景,在做读写分离时,InnoDB做主服务器,负责写,读可以负责也可以不负责;MyISAM作从服务器,只负责读。

那么至于update呢?

????

六 Memory引擎

解密DS90UB983-Q1的汽车电子魔法:如何通过FPD-Link IV实现4K视频的无缝传输 本文深入解析了德州仪器DS90UB983-Q1串行器芯片如何通过FPD-Link IV技术在汽车电子中实现4K视频无缝传输。文章详细介绍了该技术的核心功能,包括多流传输(MST)模式、热插拔检测(Hot Plug Detect)机制以及电磁兼容性设计,为车载信息娱乐系统提供了高带宽、低延迟的可靠解决方案。 阅读详情

相关推荐

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 741

MySQL - 存储引擎MyISAM和Innodb

首先,我们先看一下MySQL的体系架构,对MySQL整个架构有一个直观的感受: MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。存储引擎在MySQL的体系架构中位于第三层,负责MySQL中数据的存储与提取,是与底层系统文件打交道的子系统。MySQL存储引擎是插件式的,执行器通过调用存储引擎的API接口操作数据,接口屏蔽了不同存储引擎之间的差异,可以根据不同的需求去选择不同的存储引擎。存储引擎是根据MySQL提供的文件访问层抽象接口定制的一种文件访问机制,这种机制就

迪曼奥特迦-博客 5063

用AI助手Cursor轻松自动生成流程图

通过 Cursor + Mermaid,我们可以快速、准确地自动生成流程图,上面演示的例子部分流程图可能比较丑,我们可以通过流程图软件导入Mermaid代码,然后手动进行微调就可以了,如果你对美观要求不是特别多,可以直接用,这将极大地提升代码可视化和架构设计的效率。

呱牛 Just do IT 1936

高性能MySQL(3th)(第一章 MySQL概述) —— 03 MySQL默认事务提交

一 MySQL默认采用自动提交(autocommit) 注意,MySQL的innodb引擎支持事务,MyISAM不支持。对于innodb而言,每一条“sql+分号”+回车后,就相当于封装了一个事务,即以下的第一种方式实质上就是第二种方式: 第一种: 第二种: 一言以蔽之 —— Innodb的每一条sql都默认是自动提交的事务。 则就有了这样的推论:采用Innodb引擎的默认情...

ProLayman的博客 301

新手DIY无人机,从电机到飞控,这份配件清单和避坑指南请收好

本文为无人机DIY新手提供从电机到飞控的完整配件清单和避坑指南。详细解析电机KV值选择、电调匹配、飞控系统调试等核心问题,帮助初学者避开常见雷区,顺利完成首飞。特别推荐FPV竞速机和航拍机的配件组合方案,并附赠实用调试命令和故障排查表。

weixin_27032989的博客 236

数据集分享 | IWR1642呼吸心跳数据集

雷达开源数据库 数据集

【调皮连续波】雷达技术领域知识博主 3205

Mysql Innodb的恢复

作者: Rainny日期: 2009-1-8原来的MYSQL机器:172.17.16.27新的MYSQL机器:172.17.16.222 目的:将27号机的WIKI备份,然后恢复到222号机 先在27号机写一个备份wiki数据库的脚本,内容如下:#!/bin/sh#datestr=`date +%a`datestr=`date +%y%m%d`bug

你们有病吗? 862

空频、空时、空域、时域、频域抗干扰介绍

1、时域抗干扰:对时间域序列进行滤波,滤波系数h(n),采样序列不断进行输入与滤波系数卷积计算,得到响应输出;例如常用的FIR和IIR滤波器。 对于多窄带干扰噪声源和连续波干扰源有较好的处理效果,还可以解决多径问题; 可以通过在接收机前端处理中增加一个嵌入式块实现; 2、频域抗干扰:接收机不容易受到相对于接收机频带以外的强功率干扰; 通常为带通滤波和阻带滤波, 适用于窄带干扰噪声源,连续波干扰源以及较强的频带外干扰噪声源, 3、空域抗干扰:通过多个自适应天线按照特定组合成天线阵列,波束成形,针对

qq_43517907的博客 7301

mysql日期函数面试_面试-MySQL_MySQL

1 事务的特性事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分的特征一样。事务是应用中不可再分的最小逻辑执行体。(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当...

weixin_42498487的博客 169

支付宝h5参数如何实现跳转?(包含相关Demo代码)

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 3245

Oracle EBS FA 创建成批增加执行时间长且报错

摘要 Oracle EBS系统在执行"创建成批增"请求时出现长时间运行并报错(ORA-00603和ORA-03114)。

陈显平的专栏-Oracle EBS 173

4th day

老师讲的好快啊... /* 建一个innodb类型且字符集为utf8的表,其中包括以下类型的字段:int(自增长),float,char,varchar,datetime,date,text,enum, set。并且在自增长的int类型字段上有主键,varchar类型字段上有普通索引 2,给该表添加一个int字段,默认值是18; 3,修改表中char类型字段设定的长度; ...

weixin_30808575的博客 120

YOLO11涨点优化:半监督学习 | 结合Unbiased Teacher框架,利用海量无标签数据实现自训练暴力涨点

本文提出了一种基于Unbiased Teacher v2的半监督学习方法,用于解决YOLO11目标检测模型在标注数据不足时的性能瓶颈问题。通过分析纯监督YOLO11在小样本场景下的局限性,揭示了朴素自训练方法的三大陷阱:确认偏差、类别不均衡和噪声累积。文章详细解析了Unbiased Teacher框架的核心设计理念,包括教师-学生模型互监督机制、类别平衡损失和Burn-In预热策略,并重点介绍了v2版本针对无锚框检测器的优化。最后提出将Unbiased Teacher与YOLO11相结合的融合架构设计方案,

2601_95807009的博客 207

Mysql复习笔记(1)- 架构简介及安装

MySQL笔记 1 mysql的架构介绍 1.1 Mysql简介 1.1.1 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。 MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 Mysql是开源的,所以你不需要支付额外的费用。 Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。 Mysql支持大型的数据库。可以处理拥有上千万条记录的

qq_42409495的博客 613

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL设置优化[转载]

MySQL的默认配置文件以节省资源为初衷,在资源有限、查询简单、数据集小的情况下运行良好,在查询复杂、数据集大时,配置文件需量身定制。引言Before you start changing configuration settings, you should keep in mind the fact that “more is not always better”. You might have 16-20 GB of RAM, but that doesn’t mean that you should

睿 585

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

InnoDB On-Disk Structures(一)-- Tables (转载)

转载、节选于https://dev.mysql.com/doc/refman/8.0/en/innodb-tables.html 1.InnoDB Architecture The following diagram shows in-memory and on-disk structures that comprise theInnoDBstorage engine archi...

weixin_30416497的博客 413

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

On MySQL replication, again…

http://mituzas.lt/2010/06/30/replication/[@more@]http://mituzas.lt/2010/06/30/replication/很是认同,转载下There are few th...

cod42960的博客 138

使用XtraBackup进行Mysql备份还原

一、备份说明 https://www.percona.com/downloads/ [root@www ~]#man innobackupex INNOBACKUPEX(1)               Percona XtraBackup               INNOBACKUPEX(1) $ innobackupex--user=DBUSER --password=SECRET...

Field_Yang的博客 1482

2024银四特惠:阿里P8架构师手敲20W字调优实战笔记(重点:MySQL+JVM+Tomcat)(1)

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

2301_79099480的博客 587

从‘硬盘已满‘到‘内存不足‘:MySQL报错The table is full的8种排查姿势

本文系统解析了MySQL报错'The table is full'的深层原因与排查方法。从检查磁盘空间、调整tmp_table_size和max_heap_table_size内存参数,到监控InnoDB临时表空间膨胀,提供了从操作系统层到SQL层的八步诊断逻辑,帮助开发者快速定位并解决这一常见但易误解的数据库错误。

zeta9的博客 252

mysql configuration_configuration for mysql

数据库mysql 在我实际的运用中,确实出现了不少的问题:1.一次数据库文件大小达到了20G,把整个磁盘全部都吃掉了,导致系统异常慢2.没有配置bin日志,结果在自动化的时候,一次失误,把编辑部录了一天的数据全部搞没有了3.没有配置好mysql服务器,经常出现max connnection too many,或者是数据库服务器很慢4. 一次magento的操作中,没有注意它的表类型,结果做了三四个...

weixin_39626211的博客 1664

innodb引擎下利用.ibd来备份恢复单个表

innodb引擎下利用.ibd来备份恢复单个表 innodb的表空间分为:共享表空间(ibdata1...)和多表空间(利用innodb_file_per_table 每个表一个表空间),不管使...

cuanqiezhou0025的博客 260

InnoDB数据表空间文件平滑迁移

作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。 前言 InnoDB存储引擎满足了MVCC和ACID特性,在需要支持事务的环境下必不可少。有些环境下,采用InnoDB可能效果比MyISAM还要来的好。不过,在很多人眼中看来,InnoDB表空间文件由于无法实现跨服务器平滑迁移,因此不愿意使...

weixin_33953384的博客 89

MySQL 深入理解-专辑demo

MySQL 采用分层架构设计,从上到下分为四层: 1.1.1 连接层 连接管理:处理客户端连接、认证、授权 连接池:复用已建立的连接,减少连接开销 线程模型:每个连接分配一个线程(One-Thread-Per-Connection) 1.1.2 服务层 服务层是 MySQL 的核心,包含 SQL 处理的完整流程:SQL 执行流程: 1.1.3 存储引擎层 MySQL 的插件式存储引擎架构是其最大特色: 1.2 MySQL 8.0 新架构特性 1.2.1 数据字典重构 MySQL 8.0 使用事务性数据

_abab的专栏 285

MySql基础笔记

MySql 之前接触最多的是Oracle,而对于mysql却没有系统的学习过只停留在会用的基础上;接下来将花费一段时间将MySQL系统的学习一边,以待后续项目中使用; 基础 存储引擎 InnoDB存储引擎,事务性数据库首选引擎,支持ACID,支持行锁和外键 提供了具有提交、回滚、崩溃恢复能力的事务安全存储引擎 InnoDB为处理巨大数据量的最大性能设计的 在主内存中缓存

alleyz 828

MySQL插入大批量数据时报错“The total number of locks exceeds the lock table size”的解决办法...

事情的原因是:我执行了一个load into语句的SQL将一个很大的文件导入到我的MySQL数据库中,执行了一段时间后报错“The total number of locks exceeds the lock table size”。 首先使用命令 show variables like '%storage_engine%' 查看MySQL的存储引擎: mysql> show va...

weixin_30564901的博客 477
上一篇: 高性能MySQL(3th)(知识补丁) —— 为什么要设置主键自增
下一篇: 高性能MySQL(3th)(第六章 sql优化) —— 01 减少冗余数据
ProLayman
博客等级 码龄10年 105粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值