据我所知,当我们使用COUNT
,DISTINCT
或LIKE %query%
(两侧的通配符)关键字运行SQL查询时,索引无法使用,数据库必须执行全表扫描。
是否有某种方法可以提升这些查询的效果?
他们真的不能使用索引,或者我们可以以某种方式解决这个问题吗?
如果我们只需要返回一列,我们可以进行仅索引扫描吗?例如:select count(id) from MY_TABLE
:在这种情况下,如果我们在“id”上有索引,我们可以进行仅索引扫描并避免命中整个表吗?
我的问题有一般意义:如果我们必须使用上面提到的运算符,你能给我一些性能指南吗?
UPDATE 至于我,我使用PostgreSQL。
答案 0 :(得分:0)
使用PostgreSQL,您可以为文本字符串创建GIN pg_trgm索引,以使LIKE'%foo%'更快,但这需要插件和PostgreSQL 9.1或更高版本。
我怀疑它本身会不会使用索引。我实际上尝试过并且无法使用它。您可以通过使用递归CTE来拉出单个记录(可以称为“稀疏扫描”)来强制使用索引。当从会计记录中抽出个别年份时,我们会做这样的事情。这需要编写特殊查询,因此不是一般情况。
由于mvcc规则,count(*)永远不能使用索引。但是,您可以通过查看相应的系统目录来获得近似结果。