мучаю DLEшные запросы. Нужно выбрать все посты из 1 категории.
условно, есть посты
dle_post (у постов еще вторая табличка есть, с цифрами. т.е. итого -4я
dle_post_extras ):
post_id | title | ...
категории
dle_category :
cat_id | title | ...
связь через таблицу
dle_category_map:
post_id | category_id
Вариант 1:
EXPLAIN SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, e.news_read, e.allow_rate, e.rating, e.likes, e.dislikes, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason
FROM `dle_post` AS p USE INDEX (cat_posts)
INNER JOIN `dle_category_map` AS cm ON ( p.id = cm.news_id AND cm.cat_id=11)
LEFT JOIN dle_post_extras e ON (e.news_id=p.id)
WHERE approve=1 AND date < (NOW() + INTERVAL 0 MINUTE)
ORDER BY fixed desc, date DESC LIMIT 1536,32
explain:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|----|-------------|-------|--------|---------------|-----------|---------|--------------------------|------|-------------|
| 1 | SIMPLE | p | ref | cat_posts | cat_posts | 1 | const | 8887 | Using where |
| 1 | SIMPLE | cm | eq_ref | PRIMARY | PRIMARY | 8 | hdvideoscript.p.id,const | 1 | Using index |
| 1 | SIMPLE | e | ref | news_id | news_id | 4 | hdvideoscript.p.id | 1 | NULL |
вариант 2:
EXPLAIN SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, e.news_read, e.allow_rate, e.rating, e.likes, e.dislikes, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason
FROM `dle_post` AS p
JOIN (
SELECT t2.id
FROM `dle_post` AS t2 USE INDEX (cat_posts)
INNER JOIN `dle_category_map` AS cm ON ( cm.news_id = t2.id AND cm.cat_id=11)
WHERE t2.approve=1 AND date < (NOW() + INTERVAL 0 MINUTE)
ORDER BY fixed desc, date DESC LIMIT 1536,32
) AS j USING (id)
LEFT JOIN `dle_post_extras` e ON (p.id=e.news_id)
explain:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|----|-------------|------------|--------|---------------|-----------|---------|---------------------------|------|-------------|
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 1568 | NULL |
| 1 | PRIMARY | p | eq_ref | PRIMARY | PRIMARY | 4 | j.id | 1 | NULL |
| 1 | PRIMARY | e | ref | news_id | news_id | 4 | j.id | 1 | NULL |
| 2 | DERIVED | t2 | ref | cat_posts | cat_posts | 1 | const | 8887 | Using where |
| 2 | DERIVED | cm | eq_ref | PRIMARY | PRIMARY | 8 | hdvideoscript.t2.id,const | 1 | Using index |
Оба отдают с примерно одинаковым временем: Но оно варьируется очень сильно от одной категории к другой, и сильно зависит от текущей страницы (т.е. чем дальше, тем больше времени съедает запрос.)
равно ~ 100ms с конца, ~2ms в начале.
Может есть третий вариант? Или один из этих допилить до вменяемого состояния.