mysql存储引擎区别有哪些
技术百科
清浅
发布时间:2019-05-06
浏览: 次 mysql中存储引擎的区别:以innodb和myisam为例,前者支持事务而后者不支持;前者强调多功能性,支持的拓展功能比较多,后者主要侧重于性能;前者不支持全文索引,而后者支持全文索引等
mysql支持存储引擎有好几种,咱们这里主要讨论一下常用的几种存储引擎。Innodb,myisam
INNODB
INNODB索引实现
与 MyISAM相同的一点是,InnoDB 也采用 B+Tree这种数据结构来实现 B-Tree索引。而很大的区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引,所谓“聚集”,就是指数据行和相邻的键值紧凑地存储在一起,注意 InnoDB 只能聚集一个叶子页(16K)的记录(即聚集索引满足一定的范围的记录),因此包含相邻键值的记录可能会相距甚远。
在 InnoDB 中,表被称为 索引组织表(index organized table),InnoDB 按照主键构造一颗 B+Tree (如果没有主键,则会选择一个唯一的并且非空索引替代,如果没有这样的索引,InnoDB则会隐式地定义一个主键来作为聚集索引),同时叶子页中存放整张表的行记录数据,也可以将聚集索引的叶子节点称为数据页,非叶子页可以看做是叶子页的稀疏索引。
下图说明了 InnoDB聚集索引的实现方式,同时也体现了一张 innoDB表的结构,可以看到,InnoDB 中,主键索引和数据是一体的,没有分开。
这种实现方式,给予了 InnoDB 按主键检索的超高性能。可以有目的性地选择聚集索引,比如一个邮件表,可以选择用户ID来聚集数据,这样只需要从磁盘读取较少并且连续的数据页就能获得某个id的用户全部的邮件,避免了读取分散页时所耗费的随机I/O。
InnoDB 则是 I/O 操作,Innodb读写采用MVCC来支持高并发。
全表扫描
当InnoDB做全表扫描时并不高效,因为 InnoDB 实际上并没有顺序读取,在大多情况下是在随机读取。做全表扫描时,InnoDB 会按主键顺序扫描页面和行。这应用于所有的InnoDB 表,包括碎片化的表。如果主键页表没有碎片(存储主键和行的页表),全表扫描是相当快,因为读取顺序接近物理存储顺序。但是当主键页有碎片时,该扫描就会变得十分缓慢
行级锁
提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如
update table set num=1 where name like “%aaa%”
MYISAM
MyISAM索引的实现
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。MyISAM索引文件【.MYI (MYIndex)】和数据文件【.MYD (MYData)】是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。先来看看结构图
上图很好地说明了树中叶子保存的是对应行的物理位置。通过该值,存储引擎能顺利地进行回表查询,得到一行完整记录。同时,每个叶子页也保存了指向下一个叶子页的指针。从而方便叶子节点的范围遍历。 而对于二级索引,在 MyISAM存储引擎中以与上图同样的方式实现,这也说明了 MyISAM的索引方式是“非聚集的”,与 Innodb的“聚集索引”形成了对比
MyISAM 默认会把索引读入内存,直接在内存中操作;
表级锁
小结:Innodb强调多功能性,支持的拓展功能比较多,myisam主要侧重于性能
区别
1、InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2、InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
3、InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
4、Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
# 多功能
# 的是
# 只需要
# 说明了
# 则会
# 如果没有
# 数据结构
# 不支持
# 并发
# 指针
# 封装
# select
# mysql
# sql
# 主键
# 键值
# count
# table
# oracle
# 比较多
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Win11任务栏怎么调到左边_Win11开始菜单居
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win10怎样安装Excel数据分析工具_Win1
- 如何正确访问 Laravel 模型或对象的属性而非
- 如何在Golang中优化文件读写性能_使用缓冲和并
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- Python面向对象实战讲解_类与设计模式深入理解
- Windows如何查看和管理已安装的字体?(字体文
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- Win11怎么关闭系统透明度_Windows11个
- 一文详解网站被黑客入侵挂马解决办法
- php485在macos下怎么配置_php485
- Windows怎样关闭开始菜单广告_Windows
- Windows11怎么用“记事本”自动换行与编码
- Dapper的Execute方法的返回值是什么意思
- Python包结构设计_大型项目组织解析【指导】
- Win11怎么设置默认PDF阅读器 Win11修改
- 如何在 Python 中将 ISO 8601 时间
- Win11如何添加/删除输入法 Win11切换中英
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么关闭定位服务 Win11禁止应用获取
- c++中如何计算坐标系中两点间距离_c++勾股定理
- Win11用户账户控制怎么关_Win11关闭UAC
- LINUX如何查看文件类型_Linux中file命
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win11怎么查看显卡温度 Win11任务管理器查
- Win10怎样清理C盘Steam游戏缓存_Win1
- Win11怎么关闭通知消息_屏蔽Windows 1
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- 如何使用Golang table-driven f
- WindowsUSB驱动安装异常怎么办_USB驱动
- php485返回数据不完整怎么办_php485数据
- 如何使用Golang实现负载均衡_分发请求到多个服
- c# 服务器GC和工作站GC的区别和设置
- windows系统如何安装cab更新补丁_wind
- Python如何创建带属性的XML节点
- php8.4xdebug无法调试怎么办_php8.
- Win11如何设置文件权限 Win11 NTFS文
- Win11时间怎么同步到原子钟 Win11高精度时
- php能控制zigbee模块吗_php通过串口与c
- 如何使用Golang搭建Web开发环境_快速启动H
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- php打包exe如何加密代码_防反编译保护方法【技
- 如何用::实现单例模式_php静态方法与作用域操作
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Python与OpenAI接口集成实战_生成式AI
- PHP 中 require() 语句返回值的用法详
- c++中explicit(bool)的用法 c++

QQ客服