Оптимизация MySQL-запроса - PullRequest
       4

Оптимизация MySQL-запроса

2 голосов
/ 26 августа 2011

У меня следующий запрос MySQL

SELECT e.id, IF(c.id = 1, g.url, e.url) AS url, IF(s.id = 4, c.short, s.name) AS sub, e.title, b.name AS category
FROM g, c, e, b, s
WHERE e.category = b.id
AND e.subcategory = s.id
AND g.c = c.id
AND (g.g = e.id OR s.id != 4)
AND e.`release` < UNIX_TIMESTAMP()
GROUP BY e.id
ORDER BY e.`release` DESC
LIMIT 15

Это заняло около 2,5 секунд. Но если я удалю GROUP BY, это займет около 1,8 секунд. Если я удаляю ORDER BY, это займет 2,3 секунды. НО, если я удаляю GROUP BY и ORDER BY, это займет около 0,005 секунд (но тогда будет много повторяющихся строк).

Что я должен сделать, чтобы получить те же результаты за меньшее время?

Вот объяснение запроса, если он помогает.

id  select_type     table   type    possible_keys   key     key_len     ref  rows   Extra
1   SIMPLE  c   ALL PRIMARY NULL    NULL    NULL    26  Using temporary; Using filesort
1   SIMPLE  g   ref console console 4   int41988_leveli.consoles.id 60  
1   SIMPLE  e   ALL PRIMARY,id  NULL    NULL    NULL    208 Using where; Using join buffer
1   SIMPLE  b   eq_ref  PRIMARY PRIMARY 4   e.cat   1   
1   SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   e.subcategory   1

EDIT:

Вот уже существующие индексы.

c.id PRIMARY KEY
b.id PRIMARY KEY
e.id PRIMARY KEY
s.id PRIMARY KEY
g.id PRIMARY KEY
g.url AND g.console UNIQUE INDEX

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Попробуйте использовать один индекс для обоих полей: e.id и e.release. Или один индекс для каждого поля: e.id и e.resourse, но я сомневаюсь, что это помогает.

0 голосов
/ 27 августа 2011

Попробуйте join скомпоновать таблицы одну за другой вместо 5 всех вместе, а затем ограничить ее where.Начните с наиболее ограничивающих join s, то есть с объединения таблиц, которые сначала производят меньше строк.

0 голосов
/ 26 августа 2011

Сколько времени занимает использование DISTINCT в предложении SELECT?

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