MySQL 视图可以利用索引进行查询吗?
MySQL 在视图上利用索引进行查询并不简单。尽管底层表有索引,但视图查询是单独处理的,可能会导致效率低下。
解决方案:覆盖索引
最佳解决方案是创建“覆盖索引” ” 在底层表上。该索引应包括视图的定义查询中引用的列以及用于分组的任何列。覆盖索引允许 MySQL 直接从索引满足视图查询,绕过访问底层表页面的需要。
例如,考虑到提供的 highscores 表的示例,覆盖索引可以是:
CREATE INDEX highscores_IX3 ON highscores (player, happened_in, score);
有了这个索引,MySQL 就可以利用它进行视图查询:
SELECT * FROM v_kobe_highscores WHERE happened_in = 2006;
为什么MySQL 中的视图可能存在问题
与其他一些数据库不同,MySQL 不会将谓词从外部查询“推送”到视图查询中。相反,视图查询是单独执行的,具体化一个包含视图定义中所有行的中间表。然后将外部查询应用于此派生表。
此过程可能会导致性能下降,特别是对于跨大型表定义的视图。
替代方案:索引独立查询
在某些情况下,执行独立查询可能比使用视图更有效。例如:
SELECT player , MAX(score) AS highest_score , happened_in FROM highscores WHERE player = 24 AND happened_in = 2006 GROUP BY player , happened_in;
在 highscore 表上使用合适的覆盖索引,此查询可以高效地检索所需的数据,而无需创建和具体化视图的开销。
以上是MySQL视图能否利用索引进行高效查询?的详细内容。更多信息请关注PHP中文网其他相关文章!