繁体   English   中英

mysql查询太慢

[英]mysql query too slow

我的简单MYSQL查询速度太慢,我的表具有550k行数据,并且基于Innodb,当我以以下方式运行查询时:

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       |
+------------------------+---------+

也许这里的问题是InnoDB

MyISAM存储总行数,InnoDB不会这样做,因此它必须进行完整的扫描,这需要很长时间。 查看手册的看板是否对您有帮助:

手册

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM