The MySQL/MariaDB optimiser likes to know things like the
cardinality of an index – that is, the number of distinct values
the index holds. For a PRIMARY KEY, which only has unique values,
the number is the same as the number of rows. For an
indexed column that is boolean (such as yes/no) the cardinality
would be 2.
There’s more to it than that, but the point is that the optimiser
needs some statistics from indexes in order to try and make
somewhat sane decisions about which index to use for a particular
query. The statistics also need to be updated when a significant
number of rows have been added, deleted, or modified.
In MyISAM, ANALYZE TABLE does a tablescan where everything is
tallied, and the index stats are updated. InnoDB, on the
other hand, has always done “index dives”, looking at a small
sample and deriving from that. That can be ok as a methodology,
but unfortunately the history is awkward. The …
[Read more]