count(*) is slow in innodb due to Multi Versioning. Which table type are you
using ?

Thanx
Alex

On 6/9/06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:

Hi everybody,

MySQL 5.0.21 running on RedHat EL4, 2GHz CPU, 2,5GB RAM, RAID5/128MB
RAM. At one point I had to issue the following query on a 1.8GB 42mil
records table:

SELECT COUNT(*) FROM geoRecord WHERE geoRecord.geolatitude IS NOT NULL ;

As it took forever to complete (I mean more than 20 minutes) I've
stopped the client and attempted to work around.

The table looks like this:

EXPLAIN geoRecord;
+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| georecordkey    | int(11)     | NO   | PRI | NULL    | auto_increment |
| geobiorecordkey | int(11)     | NO   | MUL | 0       |                |
| geolocationtext | varchar(85) | YES  | MUL | NULL    |                |
| geoprecision    | int(11)     | YES  | MUL | NULL    |                |
| geolatitude     | float       | YES  | MUL | NULL    |                |
| geolongitude    | float       | YES  | MUL | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+

The indexes on it look like this:

SHOW INDEX FROM geoRecord ;

+-----------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name        | Seq_in_index |
Column_name     | Collation | Cardinality | Sub_part | Packed | Null |
Index_type | Comment |

+-----------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
| geoRecord |          0 | PRIMARY         |            1 |
georecordkey    | A         |    47808182 |     NULL | NULL   |      |
BTREE      |         |
| geoRecord |          1 | geobiorecordkey |            1 |
geobiorecordkey | A         |    47808182 |     NULL | NULL   |      |
BTREE      |         |
| geoRecord |          1 | geolocationtext |            1 |
geolocationtext | A         |    11952045 |     NULL | NULL   | YES  |
BTREE      |         |
| geoRecord |          1 | geoprecision    |            1 |
geoprecision    | A         |    23904091 |     NULL | NULL   | YES  |
BTREE      |         |
| geoRecord |          1 | geolatitude     |            1 |
geolatitude     | A         |     5976022 |     NULL | NULL   | YES  |
BTREE      |         |
| geoRecord |          1 | geolongitude    |            1 |
geolongitude    | A         |     5976022 |     NULL | NULL   | YES  |
BTREE      |         |

+-----------+------------+-----------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+

Also:

EXPLAIN SELECT COUNT(*) FROM geoRecord WHERE geoRecord.geolatitude IS
NOT NULL ;

+----+-------------+-----------+-------+---------------+-------------+---------+------+----------+--------------------------+
| id | select_type | table     | type  | possible_keys | key         |
key_len | ref  | rows     | Extra                    |

+----+-------------+-----------+-------+---------------+-------------+---------+------+----------+--------------------------+
|  1 | SIMPLE      | geoRecord | range | geolatitude   | geolatitude |
5       | NULL | 44891097 | Using where; Using index |

+----+-------------+-----------+-------+---------------+-------------+---------+------+----------+--------------------------+


I've run a CHECK TABLE on it, it came OK too. I've run  "ANALYZE TABLE
geoRecord " already. Attempting to solve the problem I've come up with
this:

SELECT COUNT(georecordkey) FROM geoRecord WHERE geoRecord.geolatitude IS
NOT NULL ;

This query takes 1 min and 20 seconds and gives the right answer (still
way too long IMO) but then why on earth is the COUNT(*) behaving so bad?
If there's a mistake it's got to be so obvious that it eludes me. :-|




--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]


Reply via email to