Как улучшить производительность MySQL-запроса с частой частотой вставки? - PullRequest
4 голосов
/ 28 мая 2009

У меня прибл. 200K строк в таблице tb_post, и каждые 5 минут она имеет прибл. 10 новых вкладышей.

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

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

Для сортировки всех строк отсортированным способом требуется более 10 секунд.

Ниже приведен отчет запроса 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 - это тип поплавка
  • Есть индекс на tb_post.USER_ID

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

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

Ответы [ 3 ]

4 голосов
/ 28 мая 2009

Вам нужен индекс для 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";"<b>index</b>";NULL;"idx2";"10";NULL;"352";""
"1";"SIMPLE";"tb_user";"<b>eq_ref</b>";"PRIMARY";"PRIMARY";"4";"test.tb_post.USER_ID";"1";""
3 голосов
/ 28 мая 2009

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

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

1 голос
/ 28 мая 2009

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

Karl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...