myisam和innodb中count(*)的区别

本文对比了MyISAM和InnoDB存储引擎下COUNT(*)及COUNT(column)等查询的区别。MyISAM存储表行数,使COUNT(*)快速返回结果;而InnoDB则需全表或全索引扫描。存在WHERE条件时,若列有索引,则使用索引扫描。

COUNT(*) for Innodb Tables
http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

 

总结:

1.myisam保存表的总行数,因此count(*)并且无where子句,很快会返回表的总行数
2.myisam保存表的总行数,利用count(column)并且无where子句,并且此column不为null,很快会返回表的总行数
3.myisam保存表的总行数,利用count(column)并且无where子句,并且此column可以为null,mysql会对表进行全表或全索引扫描来确定行数
4.innodb查询count(*),count(column(not null)),count(column(may be null))并且无where子句,mysql会对表进行全表或全索引扫描来确定行数
5.myisam和innodb查询count(*),count(column(not null)),count(column(may be null))并且存在where子句,mysql会对表进行索引扫描(如果列上有索引),速度也比较快

### MyISAM InnoDB 存储引擎的主要区别 #### 性能与应用场景 MyISAM 更适用于读密集型的操作环境,尤其当应用程序主要涉及查询操作而非频繁写入时。相比之下,InnoDB 则更适合于高并发场景以及需要事务支持的情况[^1]。如果业务逻辑中存在大量的增删改操作或者对外键约束有需求,则应优先考虑使用 InnoDB。 #### 查询效率对比 从查询效率来看,在纯 SELECT 操作下,通常情况下 MyISAM 表的表现优于 InnoDB;然而在 INSERT 或 UPDATE 场景里则是后者占据优势[^2]。因此可以根据具体的工作负载特性来决定采用哪种存储引擎更为合适。 #### 数据完整性保障机制 关于数据安全性一致性方面,两者之间也存在显著差异——InnoDB 提供了完整的 ACID 遵循能力并通过引入 MVCC (Multi-Version Concurrency Control) 来管理多个会话间的交互过程,同时还允许定义外键关系以维护参照完整性[^4]。与此相反的是,尽管 MyISAM 能够快速完成某些特定任务比如全文检索等功能,但它缺乏内置的事物处理能力跨表关联控制手段[^3]。 #### 特殊功能支持情况 另外值得注意的一点在于特殊索引形式上的差别:虽然二者均支持 B+Tree 类型的标准次序访问路径构建方式,但是只有 InnoDBMySQL 5.6 开始才正式加入了对 FULLTEXT 文本匹配结构的支持,并且随着版本迭代逐步完善了针对地理位置信息建模所需的相应工具集[^4]。与此同时,由于其实现原理的不同之处决定了它们各自具备独特的优势项目列表如下所示: | 功能项 | **MyISAM** | **InnoDB** | |----------------|------------------|--------------------| | 备份/时间点恢复 | 支持 | 支持 | | 压缩数据 | 只读模式下的部分支持 | 完整支持 | | 加密数据 | 使用外部插件实现 | 内置支持 | | 聚合索引 | 不支持 | 支持 | | 外键支持 | 缺乏原生支持 | 强大支持 | 最后还需提及一点有关元数据统计更新频率的问题:每当发生任何修改动作之后都会触发重新计算相关指标的动作发生在 Innodb 上面;而对于那些基于固定计数值维持策略设计出来的 Myisam 文件而言则无需如此繁琐的过程就能即时获取到总数目等基本信息[^5]。 ```sql SELECT COUNT(*) FROM my_table; ``` 以上就是围绕这两个主流 mysql 存储引擎展开讨论所得出的一些核心结论概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值