2009-05-28 2 views
4

У меня прибл. 200 тыс. Строк в таблице tb_post, а каждые 5 минут - ок. 10 новых вставок.Как повысить производительность MySQL-запроса с частыми ставками вставки?

Я использую следующий запрос для выборки строк -

SELECT tb_post.ID, tb_post.USER_ID, tb_post.TEXT, tb_post.RATING, tb_post.CREATED_AT, 
     tb_user.ID, tb_user.NAME 
FROM tb_post, tb_user 
WHERE tb_post.USER_ID=tb_user.ID 
ORDER BY tb_post.RATING DESC 
LIMIT 30 

Это занимает более 10SEC, чтобы извлечь все строки в отсортированной моде.

Ниже приводится отчет EXPLAIN запроса:

id select_type  table  type possible_keys key    key_len  ref   rows  Extra 
1 SIMPLE   tb_user  ALL  PRIMARY   NULL   NULL  NULL  20950  Using temporary; Using filesort 
1 SIMPLE   tb_post  ref  tb_post_FI_1 tb_post_FI_1 4   tb_user.id 4

Несколько входов:

  • tb_post.RATING является тип Float
  • Существует индекс tb_post.USER_ID

Может кто-нибудь предложить мне несколько указаний о том, как мне это оптимизировать запросить и улучшить производительность чтения?

PS: Я новичок в вопросах масштабирования базы данных. Поэтому любые предложения будут полезны для этого запроса.

+1

Почему вы не хотите индексировать? –

+0

Извините за путаницу. Я исправил свой вопрос. Я хочу индексировать, и USER_ID уже проиндексирован, но он по-прежнему не помогает. Вопрос в том, должен ли я индексировать и другие столбцы, и если да, то какие? – Aditya

+0

Maybee вам следует подумать об использовании операции JOIN и остерегаться того, что вы присоединяетесь к своим столам - сначала меньше. Но это зависит от используемой вами базы данных. Подробнее http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive/173744#173744 –

ответ

1

Что произойдет, если вы отпустите ORDER BY, имеет ли это влияние на производительность? Если это имеет большой эффект, то, возможно, стоит рассмотреть индексацию tb_post.RATING.

Карл

+0

Я не могу снять предложение ORDER BY , Мне нужно показать результаты на основе его популярных рейтингов. – Aditya

+0

@Aditya - Вы пытались добавить индекс на tb_post.rating? – warren

3

Вы можете индексировать tb_post.RATING: MySQL иногда может использовать индексы для оптимизации ORDER BY положения: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

Если вы пытаетесь агрегировать данные из разных таблиц, можно также проверить, какой тип join (http://en.wikipedia.org/wiki/Join_(SQL)) вы хотите. Некоторые из них лучше других, в зависимости от того, что вы хотите.

+0

«Сори для URL-адресов, мне не разрешено размещать гиперссылки ...» - это «исправление» :-) – VolkerK

+0

tb_post.RATING - это тип Float. Значит, индексы отлично работают на столбцах типа Float? Кроме того, RATINGs часто меняются, когда кто-то голосует за этот пост. Поэтому каждый раз, когда кто-то голосует, MySQL должен будет снова создавать индексы. Если частота голосования довольно частая, то индексы построения каждый раз могут быть дорогими, не так ли? Я попытался добавить индексы на RATING, и теперь первый раз это занимает больше 10 секунд, но в следующий раз, если новых голосов нет, это займет 1-2 секунды. Но как только кто-то голосует, для получения одной и той же страницы снова требуется много времени. Итак, пожалуйста, совет. – Aditya

+1

Как вы создаете свой индекс и, что более важно, обновляете рейтинг? Я просто проверил таблицу тестов строк (id, rating, text, user_id): создание индекса занимает 3 секунды независимо от того, что содержит индекс (и, в частности, с использованием способа VolkerK). Обновление одной строки для изменения рейтинга занимает несколько миллисекунд, как и должно быть. Вы не создаете индекс при каждом обновлении: вместо этого вы запускаете обычный запрос UPDATE и позволяете MySQL обновлять свой индекс. Если вы уверены, что правильно выполняете обновление (UPDATE, а не CREATE INDEX), убедитесь, что виновником является MySQL, а не система кэширования или что-то еще. –

4

Вам нужен индекс для tb_post, который охватывает как предложение ORDER BY, так и WHERE.

CREATE INDEX idx2 on tb_post (rating,user_id)

= > выход EXPLAIN SELECT ... ORDER BY tb_post.RATING DESC LIMIT 30

"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra" 
"1";"SIMPLE";"tb_post";"index";NULL;"idx2";"10";NULL;"352";"" 
"1";"SIMPLE";"tb_user";"eq_ref";"PRIMARY";"PRIMARY";"4";"test.tb_post.USER_ID";"1";""
Смежные вопросы