通过重写优化这个mysql查询?

时间:2014-02-04 14:09:11

标签: mysql optimization rewrite

我正在尝试优化mysql以减少我的服务器负载..在这里,我有一个复杂的查询,在一个四核服务器上使用大约1k次/分钟,8gb ram,我的服务器正在关闭。

我尝试了很多方法来重写这个查询:

SELECT * 
  FROM (
    SELECT  a.id, 
            a.url 
    FROM surf a 
        LEFT JOIN users b 
            ON b.id = a.user 
        LEFT JOIN surfed c 
            ON c.user = 'asdf' AND c.site = a.id 
    WHERE   a.active = '0' 
        AND (b.coins >= a.cpc AND a.cpc >= '2') 
        AND (c.site IS NULL AND a.user !='asdf') 
   ORDER BY a.cpc DESC, b.premium DESC 
      LIMIT 100) AS records 
ORDER BY RAND() 
   LIMIT 1

但它没有用。所以你们可以帮我改写上面的查询,这样就不会浪费任何资源吗?

此查询也没有任何索引:(。指导我为此创建索引会非常有帮助。

1 个答案:

答案 0 :(得分:0)

问题很可能是内在的排序。

您应该在surfed(site, user, cpc)surf(active, user, site)user(id, coins)上建立索引。

您也可以通过将join切换到外部联接的内部联接来进行微小的改进。 where子句无论如何都要撤消left outer join,因此这不会影响结果。

但我不认为这些改变会有所帮助。问题是内部查询中的结果集的排序。外部排序rand()是一个小问题,因为您只在100行上进行排序。

如果您运行此1,000 /分钟,则需要重新考虑数据结构并开发一种方法,使您更容易获得所需的数据。