如何让MySQL使用索引进行视图查询?简短的答案,提供了MySQL可以使用的索引。
在这种情况下,最佳索引可能是“覆盖”索引:
... ON highscores (player, happened_in, score) MySQL可能会使用该索引,并且EXPLAIN将显示:"Using index"由于WHERE player = 24 (索引前导列上的相等谓词。索引中GROUP BY happened_id的第二列),MySQL可能会使用索引来优化该索引。避免排序操作score,在索引中包含该列将使查询完全可以从索引中满足,而不必访问(查找)索引所引用的数据页。
那是快速答案。更长的答案是,MySQL非常不可能happened_id在视图查询中使用前导列的索引。
为什么视图会导致性能问题
MySQL视图的问题之一是MySQL不会将谓词从外部查询“推”到视图查询中。
您的外部查询指定WHERE happened_in = 2006。MySQL优化器在运行内部“视图查询”时不会考虑该谓词。该视图查询将在外部查询之前单独执行。该查询执行的结果集“物化”;也就是说,结果存储为中间MyISAM表。(MySQL称它为“派生表”,当您了解MysQL执行的操作时,它们使用的名称就很有意义。)
最重要的是,happened_in当MySQL破坏形成视图定义的查询时,您正在使用的索引将不被MySQL使用。
创建中间“派生表”之后,然后使用该“派生表”作为行源来执行外部查询。在外部查询运行时,对happened_in = 2006谓词进行评估。
请注意,存储了视图查询的所有行,(在您的情况下)是EVERY值的行happened_inÿ