【发布时间】:2016-07-31 17:26:32
【问题描述】:
在分析某些查询的 PostgreSQL 查询执行计划时,您可以利用 Index-only scans:
仅索引扫描是 Postgres 9.2 中添加的一项主要性能特性。它们允许仅通过从索引而不是从表中检索数据来满足某些类型的查询。
你可以在 MySQL 中使用类似的东西吗?
【问题讨论】:
标签: mysql sql performance postgresql indexing
在分析某些查询的 PostgreSQL 查询执行计划时,您可以利用 Index-only scans:
仅索引扫描是 Postgres 9.2 中添加的一项主要性能特性。它们允许仅通过从索引而不是从表中检索数据来满足某些类型的查询。
你可以在 MySQL 中使用类似的东西吗?
【问题讨论】:
标签: mysql sql performance postgresql indexing
有趣的是,您想要在 Mysql 中进行类似 Postgres 仅索引扫描的操作。
因为早在 Postgres 9.2 之前,Mysql 就有这个特性。但是在mysql中这个特性叫做covering index:
包含查询检索到的所有列的索引。反而 使用索引值作为指针来查找完整的表行, 查询从索引结构返回值,节省磁盘 I/O。 InnoDB 可以将此优化技术应用于比 MyISAM 更多的索引, 因为 InnoDB 二级索引还包括主键列。 InnoDB 无法将此技术应用于针对已修改表的查询 通过交易,直到该交易结束。
任何列索引或复合索引都可以作为覆盖索引, 给出正确的查询。设计你的索引和查询 尽可能利用这种优化技术。
【讨论】:
是 - 如果查询有覆盖索引,MySQL 可能只读取索引,而不读取表数据。
http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html
在某些情况下,可以优化查询以在不查阅数据行的情况下检索值。 (为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅使用表中包含在某个索引中的列,则可以从索引树中检索所选值以获得更快的速度:
SELECT key_part3 FROM tbl_name WHERE key_part1=1
【讨论】: