MySQL性能问题 - 很多ORing

时间:2009-11-29 08:20:19

标签: mysql database performance

Facebook API有一个电话$ facebook-> api_client-> friends_getAppUsers();并返回正在使用该应用程序的用户的朋友ID。

现在说我想从我的db表中选择与 all 那些朋友ID匹配的所有行。

我能想到的唯一方法就是

SELECT * FROM my_table WHERE uid IN(friend1,friend2,friend3,friend4 ... friend100);

但这种选择难道不会令人望而却步吗?还有另一种方法可以达到同样的目的吗?这应该是facebook应用程序中非常常见的事情。

如果您查看“原因”应用程序,它可以让您查看朋友的原因。我猜测应用程序必须从Cause表中挑选出与所有用户ID匹配的所有行。

我是以错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

如果您在uid上没有索引,查询分析器将对my_table执行表扫描并根据朋友列表测试每一行(将其视为只在每个行上执行的if语句的级联行)。所以它的成本与以下相同:

SELECT * FROM my_table;

现在,如果您在uid上创建索引,如果正在测试的朋友集相对较大,查询分析器仍可能会进行表扫描。如果列表中的朋友相对较少,则可以通过uid进行单独查找。在现实数据集上运行一些实验,看看会发生什么。您可以通过在EXPLAIN前加上查询来向MySQL询问任何查询计划。