如果我的查询中有太多的OR运算符,如何优化mysql查询?

时间:2009-08-13 16:57:19

标签: php mysql query-optimization

使用PHP和MySQL

我从facebook上抓了一大堆facebook用户ID。

现在我想在我的应用程序中找到该数组的相应用户名。

显然,在我的应用程序中,用户表包含唯一的用户名和唯一的fb_uid值。

我对编程的基本理解使我有两种方式:

1)使用循环并运行fb_uid数组并逐个查找用户名。

OR

2)创建一个怪物查询,例如从用户中选择distinct(用户名),其中fb_uid = value1或fb_uid = value2 ...

那么有更好的出路吗?

谢谢。

3 个答案:

答案 0 :(得分:10)

使用SQL的IN运算符代替:

select distinct(username) from users where fb_uid in (value1, value2, ...)

http://www.w3schools.com/SQl/sql_in.asp

答案 1 :(得分:1)

如果你的fb_uids列表很大(例如,超过100或500 r 1000 ids),我就不会采用“或”方式:太多“或”像这样我认为会伤害数据库。

但每个id执行一次查询也不是很好......


那么这两个想法的混合呢?每个例如50或100个fb_uids做一个查询?

而且,不是使用批次或OR,而是可以使用IN;有点像这样:

select distinct(username) from users where fb_uid IN (id1, id2, id3, ...)

不确定它会改变数据库的任何内容,但至少它看起来更好^^

唯一的问题是你不应该在IN中使用太多的ID;所以,做一些查询,每次可能有50到500个ID。


为了进一步帮助您,您可能需要查看array_slice,以提取fb_uids数组的“切片”......

答案 2 :(得分:0)

还有另一个MySQL功能:MATCH AGAINST

SELECT * FROM customer WHERE status = 1 AND MATCH (person, city, company, zipcode, tags) AGAINST ('".$searchstring."' IN BOOLEAN MODE)

您的输入字符串将在不同的列中搜索。

如果你不知道这个函数,也许你可以重新考虑你的sql语句。