`
xiaoych
  • 浏览: 145949 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysql的innodb引擎的count(*)陷阱

阅读更多
    今天同学们在群里讨论oracle的count(*)与count(1)的问题,正好提到mysql的情况。我突然想到自己遇到的问题:在myisam引擎执行count(*)速度非常快,而且执行速度与记录条数无关,而innodb却不是这样,记录越多,速度越慢。

    于是做了一个实验,在一个有8000W条记录的innodb表执行了一下 select count(*) from table 。 果然一直等待,大概8分多后出来结果。马上再次执行相同的语句,用时大约22秒。马上执行第三次,还是约22秒。

    于是我猜想innodb没有把记录数保存起来,而是做了实时统计,所以导致速度比较慢。第二次、第三次相对较快是因为高速缓存的原因。于是打电话咨询DBA同学。经过DBA同学的专业解答,我明白了:我猜对了,呵呵。所以,以后要注意在innodb中count(*)的问题,尽量避免吧……除非能确保该表始终保持很少的记录数。

    另外,在网上查了一些资料:

   
引用

InnoDB Pitfalls
However, all is not rosy with InnoDB. Because of its transactional nature, it has bottlenecks of its own. On MyISAM, doing a query that does SELECT COUNT(*) FROM {some_table}, is very fast, since MyISAM keeps the information in the index.

On InnoDB, this info is not stored in an index, and even the index and the data are kept in the same file. So, doing the same query on a table can incur a significant performance penalty.

To check what overhead this has, I wrote a simple test benchmark code. I duplicated a client node table that has 20,243 rows from MyISAM to InnoDB.

On a quiescent AMD 64 machine with MySQL server 5.0.24, doing a SELECT COUNT(*) FROM node takes 0.835 milliseconds on MyISAM, while on InnoDB it takes 12.292 milliseconds!


记录一下,innodb引擎的count(*)问题。
分享到:
评论
11 楼 linux1689 2010-12-05  
如果想彻底学习InnoDB,推荐大家看一看《MySQL技术内幕:InnoDB存储引擎》
10 楼 pcwang 2010-02-20  
如果只是模糊查询count,或者确保不会删除数据的话,建议用max(id)这样的方式,当然前提是有自增主键。
9 楼 kkito 2010-02-07  
后面22秒的问题,查询过应该是会缓存住的。要花这么长时间?跟8kw记录数有关??
8 楼 kkito 2010-02-07  
MyISAM增加记录是顺序往后加,所以会存下记录数,count实际并没有去数,innodb的话记录是按主键排序的,count星和count主键没有区别,数量很大的话从头数一遍肯定要花时间。所以选引擎的时候也要看应用场景。8kw的记录肯定得要花点心思。我是这么理解的。
7 楼 myreligion 2010-02-05  
这不是innodb的问题,这个现象以前Mysql的站点上也讨论过。

Mysql开发人员解释说,由于事务的原因他们没有办法缓存数据,因为这样的话可能导致查到的值不对。后来又说准备增加一个hint(像sql_no_cache之类的),允许模糊查询行数,类似MyISAM,不知道什么时候才能提供。
6 楼 mccxj 2010-02-05  
这是innodb和myisam引擎的区别问题。。。不至于大惊小怪~~
5 楼 freespace 2010-02-05  
用select count(id) from table试试看
4 楼 yhailj 2010-02-05  
xiaoych 写道
在一个有8000W条记录的innodb表执行了一下 select count(*) from table 。 果然一直等待,大概8分多后出来结果。马上再次执行相同的语句,用时大约22秒。马上执行第三次,还是约22秒。


此 innodb 引擎的 table 有没有主键 ?
使用 count(1) 的执行时间是多久 ?

如果有 where 条件, 而条件中又有索引列的话, 好像两者没多大区别吧
3 楼 rainv 2010-02-05  
有解决办法没?难道要读写分离?
2 楼 rain2005 2010-02-05  
用数据库开发,还是很有必要搞清楚事务和锁的原理的,俺以前只搞过oracle,最近使用mysql,在innodb中,大数据库查询甚至会锁表,阻塞更新太不可思意了。
1 楼 redwave 2010-02-04  
现在的项目中就是这么用的,还好看到此贴,我去改改,谢谢!!!

相关推荐

    关于mysql innodb count(*)速度慢的解决办法

    MySQL中的InnoDB存储引擎在处理`COUNT(*)`查询时与MyISAM存在显著差异,这主要是因为两者在数据统计机制上的不同。MyISAM引擎在每个表中维护了一个计数器,可以快速返回表中的行数,而InnoDB则没有这样的内置计数器...

    MySql Innodb 引擎特性详解

    ### MySQL Innodb 引擎特性详解 #### 一、MySQL Innodb 引擎概述 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它提供了多种存储引擎以满足不同场景的需求。其中,InnoDB是最常用的一种存储引擎之一,...

    MySQL技术内幕 InnoDB存储引擎.pdf

    最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    《MySQL内核:InnoDB存储引擎 卷1》是一本深度探讨MySQL数据库系统核心部分——InnoDB存储引擎的专业书籍。这本书以超高清的PDF格式呈现,包含详细的书签,便于读者快速定位和查阅相关内容。InnoDB作为MySQL中最常用...

    mysql innodb引擎 知识点总结

    MySQL的InnoDB引擎是数据库管理的核心组件,尤其在处理事务处理和行级锁定方面表现出色。以下是关于MySQL InnoDB引擎的一些关键知识点: 1. **事务处理**:InnoDB支持ACID(原子性、一致性、隔离性和持久性)事务,...

    MySQL体系结构及原理(innodb)图文完美解析

    InnoDB是MySQL中最常用的一种存储引擎,它支持事务安全性和行级锁定,这使得它非常适合处理高并发或多用户的应用场景。InnoDB提供了多种高级功能,如外键约束、事务管理以及崩溃恢复机制等。 3. **MySQL与InnoDB的...

    MySQL内核:InnoDB存储引擎 卷1.pdf

    《MySQL内核:InnoDB存储引擎 卷1》由资深MySQL专家,机工畅销图书作者亲自执笔,在以往出版的两本InnoDB介绍性图书的基础之上,更深入地介绍InnoDB存储引擎的内核,例如latch、B+树索引、事务、锁等,从源代码的...

    Mysql-INNODB存储引擎详解

    本文详细介绍了mysql innodb引擎的原理、配置、调优、故障排除等

    mySql 存储引擎 启用 Innodb

    - **InnoDB**:支持行级锁定,可以在同一时间允许多个事务对同一张表进行不同行的操作。 - **MyISAM**:使用表级锁定,当有读取操作时,其他写入操作必须等待读取操作完成后才能进行。 - **事务支持**: - **...

    cacti-mysql-template指标解释.pdf

    - **MySQL Query Time Histogram (Count)**:显示查询时间直方图(计数)。 - **MySQL Replication Status**:监控MySQL复制状态。 - **MySQL Sorts**:监控排序操作的状态。 - **MySQL Table Locks**:监控表锁定的...

    mysql内核 innodb存储引擎

    《MySQL技术内幕:InnoDB存储引擎》是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、...

    MySql innodb 引擎表存储分析

    ### MySQL Innodb 存储引擎表存储分析 #### 概述 MySQL的InnoDB存储引擎是一种广泛使用的事务处理引擎,支持行级锁定和外键约束等功能。本文将深入解析InnoDB存储引擎中的表存储机制,重点介绍其如何管理和存储数据...

    关于mysql中innodb的count优化问题分享

    MySQL中的InnoDB存储引擎在处理`COUNT(*)`查询时,会根据不同的索引类型和查询条件来决定执行效率。在优化`COUNT(*)`查询时,理解InnoDB的聚集索引(Clustered Index)和辅助索引(Secondary Index)的工作原理至关...

    MySQL Innodb 索引原理详解

    本文详细介绍了MySQL InnoDB存储引擎中的索引原理及其实现方式,特别是B+树的应用。通过对比不同的树形结构,我们了解到B+树为何成为数据库索引的理想选择。此外,还讨论了InnoDB与MyISAM的主要差异,以及索引的插入...

    MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月

    MySQL内核 INNODB存储引擎-卷1-高清-完整目录-2014年5月

    2013年中国数据库大会-27-深入解析MySQL InnoDB引擎

    2013年在中国举办的数据库大会上,主题为“深入解析MySQL InnoDB引擎”的演讲由Calvin Sun(孙春生)进行,他当时是Twitter的高级经理,此前在Oracle和MySQL等公司拥有丰富的经验。在这次大会上,他向与会者深入解析...

    mysql架构与存储引擎(MySQL逻辑架构、InnoDB引擎、MyISAM引擎、存储引擎选择).docx

    除了InnoDB和MyISAM之外,MySQL还支持多种其他的存储引擎,如Memory、Archive、Federated等,这些引擎各有特色,可以满足不同的业务需求。 #### 四、存储引擎选择 选择合适的存储引擎对于保证数据库性能和稳定性至...

Global site tag (gtag.js) - Google Analytics