我正在尝试优化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
但它没有用。所以你们可以帮我改写上面的查询,这样就不会浪费任何资源吗?
此查询也没有任何索引:(。指导我为此创建索引会非常有帮助。
答案 0 :(得分:0)
问题很可能是内在的排序。
您应该在surfed(site, user, cpc)
,surf(active, user, site)
和user(id, coins)
上建立索引。
您也可以通过将join
切换到外部联接的内部联接来进行微小的改进。 where
子句无论如何都要撤消left outer join
,因此这不会影响结果。
但我不认为这些改变会有所帮助。问题是内部查询中的结果集的排序。外部排序rand()
是一个小问题,因为您只在100行上进行排序。
如果您运行此1,000 /分钟,则需要重新考虑数据结构并开发一种方法,使您更容易获得所需的数据。