帮助优化简单的MySQL查询

时间:2010-11-07 04:25:24

标签: sql mysql optimization

我只是通过记录慢速查询和EXPLAIN来优化查询。我想事情是......我不确定我应该寻找什么样的东西....我有查询

SELECT DISTINCT
       screenshot.id,
       screenshot.view_count
  FROM screenshot_udb_affect_assoc
INNER JOIN screenshot ON id = screenshot_id
     WHERE unit_id = 56 
  ORDER BY RAND() 
     LIMIT 0, 6;

看看这两个元素......我应该在哪里专注于优化?

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  screenshot  ALL PRIMARY NULL    NULL    NULL    504 Using temporary; Using filesort
1   SIMPLE  screenshot_udb_affect_assoc ref screenshot_id   screenshot_id   8   source_core.screenshot.id,const 3   Using index; Distinct

3 个答案:

答案 0 :(得分:3)

首先请不要使用 ORDER BY RAND()。当表大小很大时,这尤其会降低性能。  例如,即使使用 limit 1 ,它也会生成等于行数的随机数,并选择最小的一个。如果表大小很大或者必然会增长,这可能效率很低。有关这方面的详细讨论,请访问:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

最后,还要确保将join列编入索引。

答案 1 :(得分:1)

尝试:

  SELECT s.id,
         s.view_count
    FROM SCREENSHOT s
   WHERE EXISTS(SELECT NULL
                  FROM SCREENSHOT_UDB_AFFECT_ASSOC x
                 WHERE x.screenshot_id = s.id)
ORDER BY RAND()
   LIMIT 6

在100K记录下,可以使用ORDER BY RAND() - over that, and you want to start looking at alternatives that scale better。有关详细信息,请see this article

答案 2 :(得分:1)

我同意kuriouscoder,不使用ORDER BY RAND(),并确保将以下每个字段编入索引:

screenshot_udb_affect_assoc.id

screenshot.id

screenshot.unit_id

使用以下代码执行此操作:

在屏幕截图(id)上创建索引Index1: