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