首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql查询速度太慢

问mysql查询速度太慢
EN

Stack Overflow用户
提问于 2014-11-17 17:07:10
回答 1查看 333关注 0票数 0

我的简单MYSQL查询太慢了,我的表有550k行数据,基于Innodb,当我运行query as:

代码语言:javascript
复制
mysql> select count(*) from program;
+----------+
| count(*) |
+----------+
|   542500 |
+----------+
1 row in set (19.16 sec)

我的表定义如下:

代码语言:javascript
复制
CREATE TABLE `program` (
  `id` int(32) unsigned NOT NULL AUTO_INCREMENT,
  `apik` varchar(16) DEFAULT NULL,
  `programId` varchar(64) DEFAULT NULL,
  `status` int(10) DEFAULT '0',
  `created` int(16) DEFAULT NULL,
  `updated` int(16) DEFAULT NULL,
  `style` varchar(8) DEFAULT NULL,
  `channel` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=552331 DEFAULT CHARSET=utf8

我找到了这些信息:

代码语言:javascript
复制
mysql> show global status like 'key%';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| Key_blocks_not_flushed | 0       |
| Key_blocks_unused      | 1714736 |
| Key_blocks_used        | 0       |
| Key_read_requests      | 0       |
| Key_reads              | 0       |
| Key_write_requests     | 0       |
| Key_writes             | 0       |
+------------------------+---------+
EN

回答 1

Stack Overflow用户

发布于 2014-11-17 17:20:48

也许这里的问题是InnoDB

MyISAM存储总行计数,InnoDB不会这样做,所以它必须进行一次完整的扫描,这需要相当长的时间。看看手册kann能不能帮到你:

从manual

InnoDB不会在表中保留内部行计数,因为并发事务可能会同时“看到”不同数量的行。为了处理SELECT COUNT(*) FROM t语句,InnoDB将扫描表的索引,如果索引不完全在缓冲池中,这将花费一些时间。如果您的表不经常更改,那么使用MySQL查询缓存是一个很好的解决方案。要获得快速计数,您必须使用您自己创建的计数器表,并让您的应用程序根据插入和删除操作更新它。如果近似行计数足够,则可以使用SHOW TABLE STATUS。请参阅第14.2.12.1节,“InnoDB Performance Tuning Tips”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26969046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档