【问题标题】:how to optimize mysql query if i have too many OR operators in my query?如果我的查询中有太多的 OR 运算符,如何优化 mysql 查询?
【发布时间】:2009-08-13 16:57:19
【问题描述】:

使用 PHP 和 MySQL

我从 facebook 获取了一系列 facebook 用户 ID。

现在我想在我的应用程序中为这个数组找到对应的用户名。

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

我对 oof 编程的初步理解使我想到了两种方法:

1) 使用循环,遍历fb_uid的数组,一一找到用户名。

2) 创建一个怪物查询,例如 select distinct(username) from users where fb_uid = value1 OR fb_uid = value2 ...

那么有没有更好的出路?

谢谢。

【问题讨论】:

    标签: php mysql query-optimization


    【解决方案1】:

    改用 SQL 的 IN 运算符:

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

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

    【讨论】:

      【解决方案2】:

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

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


      那么这两种想法的混合呢?例如,每 50 或 100 个 fb_uid 执行一次查询?

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

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

      不确定它是否会改变数据库,但至少看起来更好^^

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


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

      【讨论】:

      • dev.mysql.com/doc/refman/5.0/en/… - 根据该链接,MySQL 中 IN 的最大值数仅受 max_packet_size 的限制。所以...您在其中插入的值可能非常大,但可能需要进行测试以找出 多大 大。除此之外,我喜欢你的回答:+1。
      • 我认为这可能会对性能产生一些影响——这实际上是我考虑不要在 IN() 中放置太多值的原因;不过,我不得不承认我没有对 MySQL 做任何基准测试^^
      【解决方案3】:

      还有另一个 MySQL 函数:MATCH AGAINST

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        相关资源
        最近更新 更多