Mysql 高效的SQL查询或索引,用于查找所有列是否只有1个值

Mysql 高效的SQL查询或索引,用于查找所有列是否只有1个值,mysql,sql,indexing,triggers,database-performance,Mysql,Sql,Indexing,Triggers,Database Performance,我有一个MySQL数据库和一个items表,每个item的作用域都是一个帐户。 这些物品可以有几种颜色中的一种,如下所示: account_id | uses_color ----------------------- 1 | white 1 | blue 1 | red 2 | white 项目 在项目的显示页面上,我们希望显示项目的颜色,但前提是帐户使用过多种颜色。一旦他们开始在该帐户中使用另一种颜色,我们希望显示所有

我有一个MySQL数据库和一个items表,每个item的作用域都是一个帐户。 这些物品可以有几种颜色中的一种,如下所示:

account_id | uses_color
-----------------------
1          | white
1          | blue
1          | red
2          | white
项目

在项目的显示页面上,我们希望显示项目的颜色,但前提是帐户使用过多种颜色。一旦他们开始在该帐户中使用另一种颜色,我们希望显示所有项目的颜色

例如:

当显示ID为1的项目时,我们会显示它是 白色,因为帐户中的项目是白色和蓝色的混合 和红色。 当显示ID为7的项目时,我们不会显示颜色, 因为帐户中的所有颜色都是相同的白色,所以 不需要使用颜色来区分它们。 要进行此项检查,我当前正在首先选择帐户中的任何项目,但它可以是任何项目,并运行查询以查看帐户中是否有颜色不同的项目,如下所示:

account_id | uses_color
-----------------------
1          | white
1          | blue
1          | red
2          | white
//获取帐户中的任何颜色: 从account_id=1限制1的项目中选择颜色; //查看是否使用了其他颜色红色是从上一次查询返回的: 从'items'中选择1,其中account_id=1,color!='“红色”限值1; 这是可行的,对于那些循环使用一系列颜色的帐户来说是相当有效的,但有些帐户可能有数千或数百万个项目,并且可能只使用一种颜色,因此它可能必须扫描帐户中的每一行,以查看是否没有不同的项目

我已经尝试在帐户id和颜色上添加一个复合索引,但即使是该索引也必须扫描数千或数百万条记录才能确定,因为只有少数几种颜色可以分组

这可以接受吗?是否有一种特殊的索引我可以使用,在这里会很有效,或者我需要添加一个触发器/过程来在每次插入时更新缓存的列或表

关于触发器,我的意思是:

account_id | uses_color
-----------------------
1          | white
1          | blue
1          | red
2          | white
分隔符$$ 创建触发项\u在\u插入\u更新\u帐户\u颜色之后 插入后 关于每行的项目 开始 //插入行,但如果确切的行已存在,则忽略。 将忽略插入帐户\u颜色 设置color=NEW.color,account\u id=NEW.account\u id; 结束$$ 定界符; 然后检查该表以确定是否使用如下查询显示颜色:

account_id | uses_color
-----------------------
1          | white
1          | blue
1          | red
2          | white
//如果找到其他颜色,则为True。 从account\u colors中选择1,其中account\u id=1,color!='“红色”限值1; 是否有一种索引技术可以有效地实现这一点,或者使用类似于上面的触发器来缓存表的当前状态,并在每次插入时更新它,这是我能做到的最好的方法

总而言之,我想我是在问是否有一种方法可以让索引像上面那样工作,即使对于数百万条记录,索引也很小,只需要保存这样的最小信息:

account_id | uses_color
-----------------------
1          | white
1          | blue
1          | red
2          | white

我建议:

然后,为了提高性能,您需要对itemsaccount\u id、color进行索引

如果该列中只有一个不同的值,则返回1


可以在其上附加WHERE子句,以某种方式对其进行限制。您可以在子查询中使用结果。

触发器与此有什么关系?您希望从查询中得到什么结果?幸运的是,到目前为止,所有帐户都是这样provided@GordonLinoff触发器只是一个例子,说明如果没有一个好的索引策略可以快速处理数百万行,我将如何实现这一点。我需要一个查询来告诉我整个帐户中是否只使用了一种颜色。请提供各种用例的示例数据,并显示所需的输出。@RickJames我在示例中添加了更多的列,以显示具有所有匹配颜色的帐户,并解释了我所需的结果。谢谢你让我知道我不太清楚的地方。COUNTDISTINCTcol不是比COUNTcol>1或where col慢很多吗!='值“限制1”?我已经有了有效的解决方案,我只是想知道是否有适合数百万行的快速解决方案。@Unixmonkey-你知道一个值吗?首先获取值会比较慢。在第一个示例中,acct 1的COUNTDISTINCT值为3;账户2为1。每个帐户的COUNTvalue都大于1。感谢您向我展示了如何在一个查询中实现这一点,但这不是我的目标。我已经添加了这个索引,虽然它确实表现得更好,但仍然比我想要的慢。我正在寻找一种紧凑的索引技术,可能会像触发器一样工作,我用更多的细节和例子更新了这个问题。