find没有基数的MySQL索引

我最近在我的慢查询日志中发现了一些应该使用索引的查询。 当调查phpmyadmin中的索引时,它显示空或空基数。 我不确定是什么原因造成的,但我需要find一种方法来识别此问题,而无需手动检查200多个表。

有一个脚本或查询,我可以用它来find这些“损坏”索引? 如果是这样,我可以强制重build索引?

您可以使用INFORMATION_SCHEMA.STATISTICS查找有问题的索引:

 SELECT table_schema,table_name,index_name FROM information_schema.statistics WHERE CARDINALITY IS NULL AND SEQ_IN_INDEX = 1 AND INDEX_TYPE <> 'FULLTEXT' AND table_schema NOT IN ('information_schema','mysql'); 

您可以使用此查询来创build脚本以在这些表上运行ANALYZE TABLE

 SELECT CONCAT('ANALYZE TABLE ',db,'.',tb,';') FROM (SELECT table_schema db, table_name tb FROM information_schema.statistics WHERE CARDINALITY IS NULL AND SEQ_IN_INDEX = 1 AND INDEX_TYPE <> 'FULLTEXT' AND table_schema NOT IN ('information_schema','mysql')) A; 

以下是如何使用查询来制作和执行索引统计更新:

 SQLSTMT="SELECT CONCAT('ANALYZE TABLE ',db,'.',tb,';') FROM" SQLSTMT="${SQLSTMT} (SELECT table_schema db, table_name tb FROM " SQLSTMT="${SQLSTMT} information_schema.statistics" SQLSTMT="${SQLSTMT} WHERE CARDINALITY IS NULL AND SEQ_IN_INDEX = 1" SQLSTMT="${SQLSTMT} AND INDEX_TYPE <> 'FULLTEXT'" SQLSTMT="${SQLSTMT} AND table_schema NOT IN ('information_schema','mysql')) A" mysql -u... -p... -ANe"${SQLSTMT}" > AnalyzeTablesWithNoCardinalities.sql mysql -u... -p... < AnalyzeTablesWithNoCardinalities 

警告

请记住,并非指数中的所有级别都可能具有基数。 注意我只select了SEQ_IN_INDEX = 1意味着我只查看索引的第一个索引列没有基数。 这可能适用于PRIMARY KEY列在某些情况下。

build立在上面罗兰多张贴的。 这将从NULL索引基数列表中删除任何空表。

 SELECT s.table_schema, s.table_name, s.index_name FROM information_schema.statistics AS s INNER JOIN information_schema.tables AS t ON s.table_schema = t.table_schema AND s.table_name = t.table_name WHERE t.TABLE_ROWS <> 0 AND s.CARDINALITY IS NULL AND s.SEQ_IN_INDEX = 1 AND s.INDEX_TYPE <> 'FULLTEXT' AND s.table_schema NOT IN ('information_schema','mysql') AND t.ENGINE <> 'MEMORY';