2016-02-01 3 views
0

У меня есть 12 запросов, которые запускаются на одной странице, по одному на каждый месяц. Они выбирают одного случайного пользователя для каждого месяца. Он работает довольно медленно, есть ли способ ускорить его? БД имеет более 5 миллионов записей, и это быстро растет .... Вот запрос:mysql select rand() runing slow

$result = mysql_query('SELECT * FROM monthly where month = "jan" and a="0" ORDER BY RAND() LIMIT 0,1;'); 

while($row = mysql_fetch_array($result)) 
{ 
$id = $row['id']; 
$ip = $row['ip']; 
$title = $row['tile']; 
$user = $row['user']; 
$email = $row['email']; 
$phone = $row['phone']; 
    } 

    . 
    . 
    . 
    . 
    . 
$result = mysql_query('SELECT * FROM monthly where month = "dec" and a="0" ORDER BY RAND() LIMIT 0,1;'); 

while($row = mysql_fetch_array($result)) 
{ 
$id = $row['id']; 
$ip = $row['ip']; 
$title = $row['tile']; 
$user = $row['user']; 
$email = $row['email']; 
$phone = $row['phone']; 
    } 

ответ

0

Проблема с производительностью в том, что функция RAND() должна быть оценена для каждого строки, удовлетворяющей предикаты (условия в предложении WHERE.) Затем MySQL должен выполнить операцию «Using filesort» для упорядочения строк. (С условием LIMIT, к счастью, MySQL не должен сортировать все строки, он действительно должен найти только самое низкое значение.

С данным запросом, как написано, обо всем, что вы можете сделать, это оптимизировать доступ к строкам, убедившись, что соответствующий индекс доступный.

... ON monthly (`month`,a) 

Если вы подправили запрос, возвращающий только столбцы, которые нужно возвращать, и это небольшое подмножество столбцов в строке ... заменить *

SELECT m.id 
    , m.ip 
    , m.tile 
    , m.user 
    , m.email 
    , m.phone 
    FROM monthly m 
WHERE m.month = 'jan' 
    AND m.a = '0' 

добавить индекс покрытия:

... ON monthly (`month`,a,id,ip,tile,user,email,phone) 

Этот индекс будет оказывать на индекс ON monthly (\ month`, а) `излишним, так что индекс может быть отброшен.

+0

Можете ли вы показать мне пример? спасибо! – Mikey

+0

** 'CREATE INDEX month_IX2 ON ежемесячно (\' month \ ', a);' ** – spencer7593

+0

Я не так хорош в кодировании, пожалуйста, покажите мне полный запрос, thx! – Mikey