我只是通过记录慢速查询和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
答案 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: