Php 如何正确选择MySQL中的几行?

Php 如何正确选择MySQL中的几行?,php,mysql,Php,Mysql,我在MySQL中有一个用户表。该表有一个电子邮件字段。我有数百封PHP电子邮件。如何选择列表中电子邮件id所在的所有记录

我在MySQL中有一个用户表。该表有一个电子邮件字段。我有数百封PHP电子邮件。如何选择列表中电子邮件id所在的所有记录<请记住,我知道我能做到:

  SELECT * FROM users WHERE 
  email IN (
email1@gmail.com, email2@gmail.com,
 email3@gmail.com, email4@gmail.com, 
email5@gmail.com);
将MySQL“
IN
”语句用于数百封电子邮件将如何影响我的查询性能?有更好的方法吗

您可以从数组中创建一个新的(可能是临时的)表,然后使用联接

另一种方法是只选择单个邮件地址,并结合一条准备好的语句(
select*FROM users WHERE email=?
)。这确实需要在循环内执行查询,通常应该避免执行查询。由于查询在准备时只解析一次,并且每次执行准备好的语句时只传输选择数据,因此这可能运行得很快。
这可能是一个需要考虑的解决方案,特别是因为非常长的查询往往会产生不必要的副作用(比如MySQL需要花费大量时间来解析语句)。

性能基本相同:

mysql> select benchmark(10000000000,'SELECT * FROM test3 WHERE (email = ''email1@gmail.com'' or email = ''email2@gmail.com'' or email = ''email3@gmail.com'' or email = ''email4@gmail.com'' or email = ''email5@gmail.com'')');
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| benchmark(10000000000,'SELECT * FROM test3 WHERE (email = ''email1@gmail.com'' or email = ''email2@gmail.com'' or email = ''email3@gmail.com'' or email = ''email4@gmail.com'' or email = ''email5@gmail.com'')') |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                                                                                                                 0 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (1 min 7.70 sec)

mysql> select benchmark(10000000000,'SELECT * FROM test3 WHERE email IN (''email1@gmail.com'', ''email2@gmail.com'', ''email3@gmail.com'', ''email4@gmail.com'', ''email5@gmail.com'')');
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| benchmark(10000000000,'SELECT * FROM test3 WHERE email IN (''email1@gmail.com'', ''email2@gmail.com'', ''email3@gmail.com'', ''email4@gmail.com'', ''email5@gmail.com'')') |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                                                                          0 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (1 min 7.75 sec)
第二次尝试:

mysql> select benchmark(1000000000,'SELECT * FROM test3 WHERE email IN (1,2,3,4,5)');
+------------------------------------------------------------------------+
| benchmark(1000000000,'SELECT * FROM test3 WHERE email IN (1,2,3,4,5)') |
+------------------------------------------------------------------------+
|                                                                      0 |
+------------------------------------------------------------------------+
1 row in set (6.72 sec)

mysql> select benchmark(1000000000,'SELECT * FROM test3 WHERE email=1 or email=2 or email=3 or email=4 or email=5');
+-------------------------------------------------------------------------------------------------------+
| benchmark(1000000000,'SELECT * FROM test3 WHERE email=1 or email=2 or email=3 or email=4 or email=5') |
+-------------------------------------------------------------------------------------------------------+
|                                                                                                     0 |
+-------------------------------------------------------------------------------------------------------+
1 row in set (6.64 sec)

我要补充一点,WHERE…或比WHERE…IN更快。

更好的方法是使用关系解决方案。例如,与其尝试传入电子邮件列表,不如维护
订阅
表和
用户订阅
表,以维护哪些用户属于哪些邮件列表。那么您的查询就是一个高效的:

SELECT * FROM users 
INNER JOIN user_subscriptions
WHERE 
  user_subscriptions.subscriptionID = 1

更好的方法?否。这是选择与列表中的项目匹配的所有行的方法。演出你试过了吗?另一种方法是创建一个包含所有电子邮件的临时表,然后
加入它。对于大量(500多封)的电子邮件,这可能会更快,但我还没有尝试过。您的电子邮件列表存储在哪里?@Vatev option会加快您的查询速度!可能是因为MySQL不必将IN重写为一堆OR。。。。据我所知,这就是它将要做的…这个带有连字符的
用户订阅
,可能被解释为一个数学运算。最好使用下划线。