2012-04-13 5 views
-1
SELECT u.id, u.honour, COUNT(*) + 1 AS rank 
FROM user_info u 
INNER JOIN user_info u2 
    ON u.honour < u2.honour 
WHERE u.id = '$id' 
    AND u2.status = 'Alive' 
    AND u2.rank != '14' 

Этот запрос в настоящее время полностью замедляет мой сервер. Это зависит от вашей чести, какой ранг вы находитесь в таблице user_info, которая хранит его у всех наших пользователей.Оптимизация и улучшение производительности этого запроса MYSQL

Снимок экрана для объяснения.

http://cl.ly/370z0v2Y3v2X1t1r1k2A

SELECT u.id, u.honour, COUNT(*)+1 as rank 
FROM user_info u 
    USE INDEX (prestigeOptimiser) 
INNER JOIN user_info u2 
    ON u.honour < u2.honour 
WHERE u.id='3' 
    AND u2.status='Alive' 
    AND u2.rank!='14' 
+1

Возможно, вам нужно добавить несколько индексов –

+0

Вы заметили, что у вас нет группы? –

+0

вы можете включить расширенный пояснения из вашего выбора – ManseUK

ответ

1

Я думаю, что нагрузка идет от условия объединения «<».

Вы можете попытаться разделить свой запрос или (или если вы предпочитаете подзапрос) и использовать индекс чести для счета.

SELECT id, honour INTO @uid, @uhonour 
FROM user_info 
WHERE id = '$id'; 

SELECT @uid, @uhonour, COUNT(honour) + 1 as rank 
FROM user_info 
WHERE status = 'Alive' 
AND rank != '14' 
AND @uhonour < honour; 
1

Во-первых, вы должны добавить пункт group by так, что ваш запрос имеет смысл.

Во-вторых, вы должны изменить столбец статуса, чтобы удерживать целое число, чтобы уменьшить индекс.

В-третьих, вы должны создать индекс по идентификатору и статуса, как это:

alter table user_info add index idxID_Status (id, status) 

Наконец, чтобы получить ряды, вы должны взглянуть на эту answer. Кроме того, вы должны добавить способ заказать их ... получение ранга без ордера на самом деле не является рангом.

+0

Почему, по вашему мнению, запрос не имеет смысла? Обратите внимание, что есть 'WHERE u.id = '$ id'', поэтому это только один пользователь, следовательно, одна группа. –

+0

@Shedal Вы заметили, что нет группы, и есть ли функция агрегата? –

+0

Да, да. Просто попробуйте выполнить простой запрос. Подсчет всех выбранных строк делает именно то, что Дэвид пытается достичь в этом случае. –

1

Как мы можем видеть из объяснения, MySQL использует неверный индекс здесь. Для начала просто отбросьте все индексы и создайте новый, содержащий по крайней мере два этих поля: Id и Honour. Это должно значительно повысить производительность.

ALTER TABLE user_info ADD INDEX myIndex (id, honour); 
+0

Как это повлияет на остальную часть сайта, которая зависит от других индексов? Могу ли я иметь сгруппированный индекс и один индекс? – David

+0

О, хорошо, мой совет был немного поспешен, я просто имел в виду это как эксперимент. Затем просто создайте этот новый индекс, не уроните ничего. Но тогда вам может понадобиться намекнуть MySQL на использование правильного индекса. –

+0

Как мне это сделать? – David

Смежные вопросы