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

本文详细比较了MySQL中InnoDB和MyISAM存储引擎的特性,包括聚簇与非聚簇索引、主键与外键支持、事务与锁机制、数据压缩及并发性能。InnoDB适用于需要事务支持和行级锁的应用,而MyISAM在读密集型应用中表现更佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 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引擎

资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值