MySQL EXPLAIN gives more rows then the COUNT with WHERE on the indexed col I have a database with a Symbol col (among a few others).

If I run:

mysql&gt; explain select count(*) from ABT where Symbol='AFMD';
+----+-------------+-------+------------+------+---------------+------------+---------+-------+---------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key        | key_len | ref   | rows    | filtered | Extra                    |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+---------+----------+--------------------------+
|  1 | SIMPLE      | ABT   | NULL       | ref  | idx_Symbol    | idx_Symbol | 41      | const | 1042126 |   100.00 | Using where; Using index |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+---------+----------+--------------------------+


it tells me that there are 1042126 rows to check, but then if I run:

mysql&gt; select count(*) from ABT where Symbol='AFMD';
+----------+
| count(*) |
+----------+
|   531383 |
+----------+


tells me that there's only 531383 values.

How is this possible if I indexed the table based on the Symbol col? I.e.:

mysql&gt; show index from ABT;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| ABT   |          0 | PRIMARY    |            1 | ID          | A         |    24583232 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| ABT   |          1 | idx_Symbol |            1 | Symbol      | A         |       40098 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
| ABT   |          1 | idx_Time   |            1 | Time        | A         |     2619249 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
| ABT   |          1 | idx_Type   |            1 | Type        | A         |           2 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+


Thanks

Edit:
This is after running ANALYZE on the table.
The difference between what EXPLAIN output shows and the actual number of rows returned by the query means your table statistics are out of date. The explain plan displays the estimated number of rows it thinks the engine will need to read. As the manual says, 


  MySQL explains how it would process the statement


(emphasis mine). Strictly speaking, the database engine cannot possibly know how many rows it needs to process until it actually processes all of them.

You can run the ANALYZE TABLE command to update statistics; EXPLAIN might be able to better estimate how many rows would be read.