Кривой запрос

12
R
На сайте с 19.07.2010
Offline
64
812

В общем проблема как всегда начинается когда на сайте появляется много данных, да ещё и запросы кривые.

Помогаю одному человеку, но, что то застрял на одном запросе.

SELECT SQL_CACHE 9 AS test,N.*,
(SELECT NAME FROM news_regions where id = N.id_region) AS region,
(SELECT NAME FROM news_category where id = N.id_category) AS category,
(SELECT NAME FROM news_sources where id = N.id_source) AS source
FROM news_news N
WHERE 1=1
AND N.id_category = 2
ORDER BY N.date DESC
LIMIT 12600,36;

при таком вот запросе выдаёт Отображает строки 0 - 29 (36 всего, запрос занял 3.0455 сек.) что не есть гуд.

записей в категории 2 где-то около полутора миллионов, вот и буксует.

помогите пожалуйста кто чем может )

Сейчас его пилю http://newsrbk.ru/ (http://newsrbk.ru/)
A
На сайте с 04.11.2007
Offline
134
#1

Похоже, что тормозит offset в лимите.

Вот такой вариант пробовали?

R
На сайте с 19.07.2010
Offline
64
#2
asteroid:
Похоже, что тормозит offset в лимите.
Вот такой вариант пробовали?

думаю вы не совсем правы, потому как запрос с LIMIT 36 ; также срабатывает 3-4 секунды

siv1987
На сайте с 02.04.2009
Offline
427
#3

Индексы? И да, при ордер бай и лимит для оптимизации следует выбирать сначала первичные ключи используя индекс.

totamon
На сайте с 12.05.2007
Offline
437
#4

а что LEFT JOIN уже не в моде? про индексы не забыли?

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
alexbalance
На сайте с 17.02.2012
Offline
57
#5

вообще обычно чтобы объединить несколько таблиц используют LEFT JOIN

например

SELECT N.NAME, nr.id, nc.id, ns.id
FROM news_news N
LEFT JOIN news_regions nr ON nr.id=N.id_region
LEFT JOIN news_category nc ON nc.id=N.id_category
LEFT JOIN news_sources ns ON ns.id = N.id_source
WHERE N.id_category = 2

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

Ragnarok
На сайте с 25.06.2010
Offline
239
#6

rustrek, как раз недавно попался на этом.

Проблема в LIMIT http://habrahabr.ru/post/41968/

Использование LIMIT
SELECT… FROM table LIMIT $start, $per_page

Многие думают, что подобный запрос вернет $per_page записей (обычно 10-20) и поэтому сработает быстро. Он и сработает быстро для нескольких первых страниц. Но если количество записей велико, и нужно выполнить запрос SELECT… FROM table LIMIT 1000000, 1000020, то для выполнения такого запроса MySQL сначала выберет 1000020 записей, отбросит первый миллион и вернет 20. Это может быть совсем не быстро. Тривиальных путей решения проблемы нет. Многие просто ограничивают количество доступных страниц разумным числом. Также можно ускорить подобные запросы использованием покрывающих индексов или сторонних решений (например sphinx).
//TODO: перестать откладывать на потом
K
На сайте с 03.06.2015
Offline
45
#7
rustrek:
то то застрял на одном запросе.

Там 4 запроса, а не 1. Культурные люди так не делают. Как делают культурные люди - см.выше.

MYSQL PHP JS HTML CSS SEO TXT США СССР
A
На сайте с 04.11.2007
Offline
134
#8
rustrek:
думаю вы не совсем правы, потому как запрос с LIMIT 36 ; также срабатывает 3-4 секунды

Т.е. простой запрос тормозит?

Сколько по времени выполняется запрос ниже?


SELECT * FROM news_news
WHERE id_category = 2
ORDER BY date DESC
LIMIT 36;
R
На сайте с 19.07.2010
Offline
64
#9
asteroid:
Т.е. простой запрос тормозит?
Сколько по времени выполняется запрос ниже?

этот вот

Отображает строки 0 - 29 (36 всего, запрос занял 3.0439 сек.)

---------- Добавлено 03.08.2015 в 14:51 ----------

alexbalance:
вообще обычно чтобы объединить несколько таблиц используют LEFT JOIN
например ....

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

спасибо, запрос выдаёт ошибку #1054 - Unknown column 'N.NAME' in 'field list'

siv1987
На сайте с 02.04.2009
Offline
427
#10
rustrek:
Отображает строки 0 - 29 (36 всего, запрос занял 3.0439 сек.)
siv1987:
Индексы?

+ SHOW CREATE TABLE и EXPLAIN SELECT приведите.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий