@AlikDex

Какой из этих двух запросов наименее ресурсоемкий?

мучаю 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 в начале.

Может есть третий вариант? Или один из этих допилить до вменяемого состояния.
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
а dle_category_map таблицы разве недостаточно, чтобы выбрать посты для нужной категории и на их основе сделать необходимую выборку по связям?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы