MySQL 不能使用索引进行视图查询吗?
尽管面临着对视图有效性的怀疑,但你面临的问题来自于优化器无法将谓词推送到视图查询中。
MySQL 单独执行视图查询,具体化在执行外部查询之前,将结果存储在中间“派生”(MyISAM) 表中。此过程会在视图查询执行期间跳过对外部查询谓词的考虑。
解决性能问题
要提高视图查询的性能,请优化索引结构:
创建覆盖索引:
定义一个“覆盖”索引,其中包含视图查询中引用的所有列。在这种情况下,创建以下索引:
ON highscores (player, happened_in, score)
此索引将允许 MySQL 通过“使用索引”访问视图查询,并避免更昂贵的“使用文件排序”。
评估独立查询:
将视图查询的执行计划与服务的独立查询进行比较类似的目的:
SELECT player , MAX(score) AS highest_score , happened_in FROM highscores WHERE player = 24 AND happened_in = 2006 GROUP BY player , happened_in
这个独立查询也可以利用覆盖索引,但它消除了实现中间表的开销。
结论:
优化 MySQL 中视图查询的关键在于设计优化器可以利用的合适索引。视图查询本质上是单独的查询,它们在被外部查询引用之前具体化。了解这种行为对于避免在 MySQL 中使用视图时可能出现的性能陷阱至关重要。
以上是为什么MySQL不能使用索引进行视图查询?的详细内容。更多信息请关注PHP中文网其他相关文章!