我的简单MYSQL查询太慢了,我的表有550k行数据,基于Innodb,当我运行query as:
mysql> select count(*) from program;
+----------+
| count(*) |
+----------+
| 542500 |
+----------+
1 row in set (19.16 sec)我的表定义如下:
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我找到了这些信息:
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 |
+------------------------+---------+发布于 2014-11-17 17:20:48
也许这里的问题是InnoDB
MyISAM存储总行计数,InnoDB不会这样做,所以它必须进行一次完整的扫描,这需要相当长的时间。看看手册kann能不能帮到你:
InnoDB不会在表中保留内部行计数,因为并发事务可能会同时“看到”不同数量的行。为了处理SELECT COUNT(*) FROM t语句,InnoDB将扫描表的索引,如果索引不完全在缓冲池中,这将花费一些时间。如果您的表不经常更改,那么使用MySQL查询缓存是一个很好的解决方案。要获得快速计数,您必须使用您自己创建的计数器表,并让您的应用程序根据插入和删除操作更新它。如果近似行计数足够,则可以使用SHOW TABLE STATUS。请参阅第14.2.12.1节,“InnoDB Performance Tuning Tips”。
https://stackoverflow.com/questions/26969046
复制相似问题