我有以下查询:
SELECT count(*) from main where platform_id='ACME' AND master_id IS NOT NULL;
查看我的数据库,我在platform_id
和master_id
都有索引。运行此查询需要8.1s。
然后我添加了一个复合INDEX:
ALTER TABLE main ADD INDEX (platform_id, master_id);
当我再次运行查询时,它只需要61.6毫秒,超过100倍!我的问题是,为什么在将两列列入索引而不是上述查询中的两个单独索引时会产生如此大的差异?
答案 0 :(得分:1)
MySQL在这种情况下只能使用一个索引。它将选择platform_id索引或master_id索引,具体取决于哪个具有最高基数(索引中不同值的数量)。您可以使用SHOW INDEXES
查看每个索引的基数。 MySQL为基数存储的值可能不正确,在这种情况下,您可以强制它使用ANALYZE TABLE main
重新计算它们,但您可能看到的结果可能仅仅是因为分布这两个指数中的唯一值是这样的,它没有选择最有效的值。在这里使用复合索引可能是最好的策略。