Description:
When we use MyISAM, we should firstly initialize index statistics using ANALYZE TABLE after adding index. Unless executing ANALYZE TABLE, index statistics isn't updated upon DML operations.
How to repeat:
mysql> create table t (a int, index(a)) engine myisam;
Query OK, 0 rows affected (0.10 sec)
mysql> insert into t values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> show index in t\G
*************************** 1. row ***************************
Table: t
Non_unique: 1
Key_name: a
Seq_in_index: 1
Column_name: a
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
1 row in set (0.00 sec)
Like this, cardinality field is firstly NULL. It's enabled after issuing ANALYZE/REPAIR/CHECK TABLE statements.
Suggested fix:
Call chk_key() after every DDL statement operations.
Description: When we use MyISAM, we should firstly initialize index statistics using ANALYZE TABLE after adding index. Unless executing ANALYZE TABLE, index statistics isn't updated upon DML operations. How to repeat: mysql> create table t (a int, index(a)) engine myisam; Query OK, 0 rows affected (0.10 sec) mysql> insert into t values(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> show index in t\G *************************** 1. row *************************** Table: t Non_unique: 1 Key_name: a Seq_in_index: 1 Column_name: a Collation: A Cardinality: NULL Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: 1 row in set (0.00 sec) Like this, cardinality field is firstly NULL. It's enabled after issuing ANALYZE/REPAIR/CHECK TABLE statements. Suggested fix: Call chk_key() after every DDL statement operations.