为啥在另一个数据库中执行相同查询时不使用索引?

Posted

技术标签:

【中文标题】为啥在另一个数据库中执行相同查询时不使用索引?【英文标题】:Why not use an index when doing the same query in another database?为什么在另一个数据库中执行相同查询时不使用索引? 【发布时间】:2019-04-25 02:00:36 【问题描述】:

我有两个数据库。 一个是产品数据库(mysql) 另一个是开发数据库(mysql)

当我使用解释键时,开发数据库使用索引, 但产品数据库不起作用。

相同的查询 相同的数据库(开发数据库是产品的副本) 相同的索引.....

所以我检查了索引,“显示索引”...

但索引相同。

解释开发数据库的结果

解释产品数据库的结果

我希望“p”表使用索引“idx_payment_tb”

【问题讨论】:

如果可以,请包含一些示例数据和您的原始查询。我最近一直在自己使用索引,我发现索引主要用于WHERE 运算符。我的一些前端同事抱怨他们的一些操作需要很长时间才能加载。当我检查查询时,WHERE 运算符中的某些字段未编入索引。所以我为那里的每个字段创建了索引,当我比较我的 EXPLAIN 时,我确实发现了一些改进。 一个“prod 副本”,尤其是最近的一个,很可能意味着统计信息比 prod 数据库“更新”得多,并且索引也可能没有那么碎片化。用非常有限的信息很难得出结论。 【参考方案1】:

当优化器选择不使用索引时,通常是有充分理由的——即数据分布使得使用索引实际上会更慢。

请将SHOW CREATE TABLEEXPLAIN SELECT 提供为文本,而不是图像。优化器可能回避索引的原因有很多;我们可能会告诉你这次使用了哪个原因。

如果它是一个小表,为什么还要麻烦索引。 如果正在使用的键在表中出现“很多”(这可能在您的开发和产品之间有所不同),则索引和数据之间的来回弹跳可能会更慢。 两台机器的统计数据可能不同。

【讨论】:

以上是关于为啥在另一个数据库中执行相同查询时不使用索引?的主要内容,如果未能解决你的问题,请参考以下文章

为啥数据库或语言平台在执行查询时不返回强类型类? [关闭]

为啥过滤时使用相同的字段会导致不同的执行时间? (不同的索引用法)

MySQL使用">="或"<="范围查询时不走索引

为啥 MySQL DELETE 无法对子查询使用索引?

mysql查询in为啥用不上索引

请教mysql模糊查询两边都用%为啥用不到索引?