MySQL查询速度很慢.索引列上的计数(*)

该表位于InnoDB表中.以下是一些可能有用的信息.

EXPLAIN SELECT COUNT(*) AS y0_ FROM db.table this_ WHERE this_.id IS NOT NULL;

+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows    | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | this_ | index | PRIMARY       | PRIMARY | 8       | NULL | 4711235 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE db.table;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | bigint(20)   | NO   | PRI | NULL    |       |
| id2          | varchar(28)  | YES  |     | NULL    |       |
| photo        | longblob     | YES  |     | NULL    |       |
| source       | varchar(10)  | YES  |     | NULL    |       |
| file_name    | varchar(120) | YES  |     | NULL    |       |
| file_type    | char(1)      | YES  |     | NULL    |       |
| created_date | datetime     | YES  |     | NULL    |       |
| updated_date | datetime     | YES  |     | NULL    |       |
| createdby    | varchar(50)  | YES  |     | NULL    |       |
| updatedby    | varchar(50)  | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
10 rows in set (0.05 sec)

解释查询在那里给我结果.但实际的查询已经运行了很长一段时间.我怎样才能解决这个问题?我究竟做错了什么?

我基本上需要弄清楚这张桌子里有多少张照片.最初编码器有一个查询,检查WHERE照片IS NOT NULL(耗时3小时),但我更改了此查询以检查id列,因为它是主键.我预计会有一个巨大的性能提升,并期待在一秒钟内得到答案,但似乎并非如此.

我需要对数据库进行哪种优化?我认为查询很好,但如果我错了,请随时纠正我.

编辑:mysql Ver 14.14 Distrib 5.1.52,redhat-linux-gnu(x86_64)使用readline 5.1

P.S:我为了一些疯狂的原因重新命名了桌子.我实际上没有名为db的数据库和名为table的问题表.

最佳答案
“长”多久了?这张表中有多少行?

MyISAM表跟踪它有多少行,因此一个简单的COUNT(*)将总是几乎立即返回.

另一方面,InnoDB的工作方式不同:InnoDB表不跟踪它有多少行,所以当你COUNT(*)时,它实际上必须去计算每一行.如果您有一个大表,这可能需要几秒钟.

编辑:尝试COUNT(ID)而不是COUNT(*),其中ID是一个没有NULL的索引列.这可能会更快.

编辑2:如果你在longblob中存储文件的二进制数据,你的表将是庞大的,这会减慢速度.

可能的解决方案:

>使用MyISAM代替InnoDB.
>保持自己的计数,也许在插入和删除时使用触发器.
>将二进制数据删除到另一个表中,或者最好是常规文件.

转载注明原文:MySQL查询速度很慢.索引列上的计数(*) - 代码日志