mysql+150000 записей+размер 500МБ. Вешается :)

F
На сайте с 24.04.2009
Offline
45
#81
LEOnidUKG:
Ого, это такой тренд нынче. Зайти кинуть умную фразу, чтобы все охали и ахали.

Лучше рукоплещите 😂

LEOnidUKG:
Избыточность, конечно же, уже побежал переписывать структуру и CMS для избыточности, которая никому нафиг не нужна. Аха?

Ну если у вас такой код что при добавлении одного поля в таблицу, и по одному запросу на добавление и удаление новости, надо переписывать структуру и CMS, то грош цена и коду и CMS 😂

mfl
На сайте с 16.10.2006
Offline
134
mfl
#82

А если индекс cat сделать составным (`cat`, `id`) ?

Запрос

SELECT * FROM `cms_freepages` WHERE cat=2 ORDER id DESC LIMIT 37710, 30

должен выполнятся быстрее чем выборка всех id

И менять в CMS ни чего не придется.

I
На сайте с 23.12.2010
Offline
25
#83
mfl:
А если индекс cat сделать составным (`cat`, `id`) ?

/ru/forum/comment/10096457

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#84
Ну если у вас такой код что при добавлении одного поля в таблицу

Это мысли, которые хранятся, чисто в вашей голове и нам трудно понять их. А то, что вы без кода тут начинаете оперировать ими, как чем-то уникальным и лучшим, выглядит по крайней мере глупо.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Funaki
На сайте с 13.09.2008
Offline
123
#85

может такой запрос даст лучше результаты


SELECT *
FROM ( SELECT @nn := @nn +1 AS `num_row` , `cms_freepages`. *
FROM `cms_freepages`, (SELECT @nn :=0 ) AS t1
WHERE `cat` = 2
ORDER BY `id` DESC) AS `tmpT`
WHERE `num_row` >= 37710 AND `num_row` < 37710 + 30
F
На сайте с 24.04.2009
Offline
45
#86
LEOnidUKG:
Это мысли, которые хранятся, чисто в вашей голове и нам трудно понять их. А то, что вы без кода тут начинаете оперировать ими, как чем-то уникальным и лучшим, выглядит по крайней мере глупо.

Вам надо выбирать записи, но не зная позиции вы выбираете нужное количество с нужного места, используя limit.

А если бы у вас было еще одно поле где новости были пронумерованы в порядке возрастания для каждой категории. То вы бы сразу выбирали бы новости по номеру в данной категории. При этом limit абсолютно ненужен, сортировка по id тоже.

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

а это решается при удалении новости одним запросом, примерно такого вида

UPDATE table SET pos=pos-1 WHERE cat=number AND id>del_id

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#87

Fearful, ну вот видите совсем другой разговор :)

Только вот вы уверены, что это будет быстрее, тесты проводили?

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

F
На сайте с 24.04.2009
Offline
45
#88
LEOnidUKG:
Fearful, ну вот видите совсем другой разговор :)

Только вот вы уверены, что это будет быстрее, тесты проводили?

Будет однозначно, потому что запрос можно представить в виде

SELECT * FROM table WHERE cat=number AND pos IN (...)

а тут нет ни лимита, ни сортировки, потому быстрее 100% будет

LEOnidUKG:

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

Так смотрите, у вас есть номер последней новости в данной категории. Значит если у вас 30 новостей на странице и вам надо выбрать например новости на 30 странице.

То вы у вас получается

SELECT * FROM table WHERE cat=number AND (pos<=A AND pos>B)

где

A = номер_последней_новости_категории - (страница-1)*количество_новостей_на_странице

B = номер_последней_новости_категории - страница*количество_новостей_на_странице

Так как количество новостей на странице не сильно велико, то запрос легко превратить в

SELECT * FROM table WHERE cat=number AND pos IN (...)

Причем если новость удалять раньше чем пересчитывать номера новостей для категории, то можно еще и создать уникальный составной индекс для сat и pos.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#89
Так смотрите, у вас есть номер последней новости в данной категории.

Это как я его узнаю? опять же select с MAX или ORDER BY или COUNT

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#90
LEOnidUKG:
SELECT * FROM `cms_freepages` WHERE cat=2 ORDER id DESC LIMIT 37710, 30

Что-то я не понял в чем проблема.

У вас id не по порядку идут в базе? Зачем обратная сортировка для пагинации?

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

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