首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择COUNT(DISTINCT )性能

选择COUNT(DISTINCT )性能
EN

Stack Overflow用户
提问于 2014-04-09 10:50:18
回答 2查看 1K关注 0票数 1

简单的问题。如何重写这样的查询:

代码语言:javascript
复制
SELECT a.name, MAX(b.value), MIN (b.value), COUNT(DISTINCT(b.value))
FROM tableA a
LEFT JOIN tableB b 
       ON a.type = b.type
WHERE b.value IS NOT NULL
GROUP BY a.name

这样它就不会在一张大但不大的桌子上慢慢来?(假设有一百万行)。还是有可能在数据库上做一些其他的“魔术”来使查询快速运行?

在这种情况下,进一步规范数据是不可能的:)

请求的位附加信息

理想情况下,该解决方案可以同时适用于MySQL和MySQL 2008,尽管Server绝对是其中的优先事项。

这两个表应该如下所示:

代码语言:javascript
复制
Table A:
    type INT NOT NULL PRIMARY KEY
    name VARCHAR(500

Table B:
    idTableC INT NOT NULL
    type INT NOT NULL
    value VARCHAR (50)

Table C:
    idTableC INT NOT NULL PRIMARY KEY
    ...

因此,一般来说,我们想说的是:对于表C中的每一项,获取表B中的所有项目及其类型,如表A所示。

然而,也有必要说:对于表A中的每一种“类型”,都要在表B中得到与之相关的信息摘要。这个问题涉及的是第二个情况:)

EN

回答 2

Stack Overflow用户

发布于 2014-04-09 11:00:10

您可以对外键使用非聚集索引,我的意思是在[A.Type][B.Type]上使用2个索引,还可以在选择[A.Name][B.value]的列上使用其他两个索引。

因此,查询所需的所有内容都在索引中。

票数 1
EN

Stack Overflow用户

发布于 2014-04-09 10:56:33

不确定您使用的是哪个数据库,但您可以确保外键tableA.type上有索引,tableB.type上还有包含tableB.value的索引。这样,SQL就不需要返回数据页来获取值,而只需从索引中检索它。您应该小心处理这个值,就好像它是一个很大的值一样,它会减慢索引的速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22960271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档