LEOnidUKG

LEOnidUKG
Рейтинг
1776
Регистрация
25.11.2006
Должность
PHP
Интересы
Программирование

Для СЧ и НЧ запросов актуальны, особенно в регионах.

Про ВЧ можно даже не мечтать, лишь так подтянуть хвосты, но это сделается автоматически при начале продвижения и покупкой ссылок.

А так на войне все средства хороши.

Странно, что кеш mysql тут вообще помогает, ведь он должен сбрасываться при любых изменениях в таблице cms_freepages. Не особо широко применимое решение.

Правильно, таблица то обновляется 1 раз в час и всё. Более она не трогается вовсе. 1 раз попала в кэш и забыли про неё.

---------- Добавлено 24.02.2012 в 01:43 ----------

тогда смысла нет тащить и сортировать массив. просто в цикле отсчитайте нужную страницу.

Да какая разница? Это нужно count вводить. А толку то? ну будет выполняться на доли секунды меньше и всё. PHP же в памяти выполняется.

netwind:
LEOnidUKG, но тогда вам удалось использовать кеш mysql и это можно назвать хорошим решением.
Все-таки, там именно тот код используется, что вы привели? Он ведь неверный и может выводить неправильные результаты. Тянитолкай дело говорит.

Чуть поправленный, чтобы уж люди тоже могли юзать:


$pages=intval($_GET['p']);$nums=$pages-1; if ($nums<0) $nums=0; //Считываем номер запрашиваемой страницы

$result=mysql_query("SELECT id FROM `cms_freepages` WHERE cat=14 ORDER BY ID"); // Берём данные из категории cat=14

while ($rowclubs = @mysql_fetch_array($result))
{
$arrayid[]=$rowclubs['id'];
}

$cnt=sizeof($arrayid); //Количество для функции постраничного вывода

$newmass=array_chunk(array_reverse($arrayid),25); //25 = сколько записей выводить на странице

$sql = mysql_query('SELECT * FROM `cms_freepages` WHERE id in ('.implode(',',$newmass[$nums]).') ORDER BY ID DESC');

while ($rowclubs = @mysql_fetch_array($sql))
{
# Вывод данных
}
Если это комментарии, то они из одной категории, но при листании должно быть видно что они не отсортированы по времени. Тянитолкай дело говорит.

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

LEOnidUKG, очистили кеши чего? mysql query cache или внутренние кеши сайта?

У сайта кэша нет. У меня там более 600 страниц в каждой категории я могу тыкать сколько угодна.

Я просто мускуль перезагрузил :)

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

rikod:
Ну я бы не сказал что никому не нужны. Наша налоговая просто ужас. :) Я больше волнуюсь, чтобы вебмани никакую инфу не передавали в налоговую РБ, потому-что все данные будут региться на белоруса. Это у вас в России там всем все пофиг :) у нас же налоговики за копейку удавятся.

Я в Казахстане, тут ещё всё прикольнее, учитывая, что обменники только частные и у меня все переводы (вывод) значатся как внутренний перевод с одного частного счёта на другой. А за что этот перевод и т.п. никого не волнует :)

netwind, действительно поторопился с выводами. Сейчас кэши очистил, разницы в скорости не увидил, что мой код на PHP, что запрос в БД.

netwind:
ну а изначальный тогда что возвращает и сколько выполняется? не должен сильно отличаться

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

MySQL вернула пустой результат (т.е. ноль строк). ( запрос занял 4.0899 сек. )

А у меня:

1. Запрос: Отображает строки 0 - 29 ( 3,898 всего, запрос занял 0.1916 сек.) [id: 515 - 1203]

2. Запрос: Отображает строки 0 - 24 ( 25 всего, запрос занял 0.0736 сек.)

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

---------- Добавлено 24.02.2012 в 00:01 ----------

Создал виртуальный раздел в памяти и поместил БД туда. Скорость возрасла раз этак в 5-10 как минимум.

Ох было бы у меня памяти 32 ГБ, положил бы тоже туда, но увы, у меня на весь сервер 2 гб.

netwind:
Но это бред. Если у вас действительно есть индекс, то сервер не будет читать каждую запись и все ее поля.
Вот я напишу такой запрос согласно вашему предположению:

select * from `cms_freepages`,
(SELECT id FROM `cms_freepages` WHERE cat=2 ORDER ID desc LIMIT 37710,30) sub
where `cms_freepages`.id=sub.id ;

Неужели в разы быстрее?

MySQL вернула пустой результат (т.е. ноль строк). ( запрос занял 4.2431 сек. )

netwind:
LEOnidUKG, я могу поверить, что это работает быстрее, но где логика? почему именно так ? У вас сервер для php намного быстрее mysql-ного ?

Вы код наверное не поняли :)

В старом коде:

1. Мы узнавали количество всех записей в категории

2. Высчитывали какой лимит нам надо, чтобы было по 25 записей на 1 странице

3. Составляли запрос с количеством LIMIT

Получается, что сервер перебирал все записи из таблицы, а они ТОЛСТЫЕ и большие, выбирал нужное количество и пыхтя выдавал нам.

В новом коде:

1. Мы составляем список всех ID в категории, не затрагивая тексты. Учитывая, что id это PRIMARY индекс, всё выполняется моментально

2. Быстро считаем количество записей в массиве и режим его по 25 штучек

3. Составляем запрос, в котором запрашиваем точные ID материала, которые нам нужны.

Наша база не напрягаясь выдаём нам точные, найденные опять же по PRIMARY индекс нужные записи и отдаёт нам :)

PROFIT!

Так изначально запрос тормозил по 2, а не по 14 категории. Как так ?

У меня 19 категорий и ч0? По каждой идёт сортировка такая. Чёт вы не туда вообще въехали :)

Всего: 31516