RAND () запрос и производительность - PullRequest
0 голосов
/ 26 марта 2011

Я пытаюсь подготовить запрос к производительности. Я надеюсь удалить RAND () из запроса ниже и заменить его на более эффективную альтернативу. У кого-нибудь есть предложения?

SELECT video.*, 
       video.wins / video.loses AS win_loss_ratio
  FROM video
 WHERE video.videoid NOT IN (SELECT vidlog.videoid
                               FROM video AS vid, 
                                    video_log AS vidlog
                              WHERE vid.videoid = vidlog.videoid)
   AND video.round = 0
ORDER BY RAND(), win_loss_ratio DESC 
LIMIT 0, 2

Спасибо! * * 1004

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Вместо использования RAND () используйте случайное число в смещении для LIMIT на языке, который вызывает этот запрос.Это может иметь две проблемы, хотя.вам нужно знать, сколько элементов в базе данных, 2. однако, выдает только что-то случайное для одного из элементов.Другой вариант - полностью исключить LIMIT и RAND () и просто выбирать случайные элементы при возврате запроса (хотя я думаю, что это будет медленнее)

Есть ли реальная причина, по которой вам нужно этовысокая производительность?Я уверен, что использования RAND () будет достаточно для такого запроса.

0 голосов
/ 26 марта 2011

Вместо подзапроса in попробовать эксклюзивное левое соединение? Таким образом, MySQL знает, что ему не нужно дважды сканировать таблицу video:

SELECT  video.* 
,       video.wins / video.loses AS win_loss_ratio
FROM    video
LEFT JOIN    
        video_log as vidlog
ON      vid.videoid = vidlog.videoid
WHERE   vidlog.videoid is null
        AND video.round =0
ORDER BY 
        RAND()
LIMIT   0 , 2
...