Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118

Кеширование результатов sql запроса в файл

28.10.2016, 05:51. Показов 2121. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Имеется интернет магазин. На каждой страничке его выскакивает баннер с десятью разными товарами (взятых из БД). То есть листая страницы, каждый пользователь делает запрос в БД. Если пользователей сотни-нагрузка на сервер возрастает с 6% до 50%. Хостинг виртуальный. Хостер матерится уже.

Решил закэшировать результаты запроса в файл.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 function read($filename) {
    if (file_exists($filename)) {
        $handle = fopen($filename, 'rb');
        $variable = fread($handle, filesize($filename));
        fclose($handle);
        return unserialize($variable);
    } else {
        return null;
    }
}
    function write($filename,$variable) {
        $handle = fopen($filename, 'a');
        fwrite($handle, serialize($variable));
        fclose($handle);
    }
....
....
....
      $data = read($filename); 
    if (empty($data)) {
               echo "данные кеша пусты";
               sql="Select......" 
               $res = $db->sql_query(sql); // результатом запроса будет несколько сотен тысяч строк 
               write($filename, $res);   // начиная отсюда вообще не понятно как делать
      } else {
               echo "данные кеша НЕ пусты";
              // как вывести результат ?
              }
Подскажите как правильно сохранить в файл результаты запроса, чтобы имм можно было пользоваться? И как пользоваться с помощью sql_fetchrow?
Может есть какое другое решение? Голову ломаю вторую неделю

ps такое решение взято отсюда:
Кликните здесь для просмотра всего текста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2016, 05:51
Ответы с готовыми решениями:

Кеширование запроса как сделать?
Всем привет! Помогите пожалуйста. Как сделать, чтобы данный скрипт запрашивал данные только 1 раз в 5 минут. Нужно его как бы закешировать,...

Сортировка результатов запроса
Здравствуйте, имеется таблица для обменивания сообщениями. Структура: id | to | from | date | attached | status | message. Чтобы получить...

Склейка результатов запроса
Пишу скрипт, который выводит информацию из бд. в бд две таблицы 1) Категории в них где id - номер категории name - называние ...

30
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.10.2016, 07:08
Цитата Сообщение от kupidon Посмотреть сообщение
результатом запроса будет несколько сотен тысяч строк
Может лучше оптимизировать код? Почему у Вас за один раз столько записей вытаскивается?
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
28.10.2016, 07:40  [ТС]
каталоги с товарами большие, последние дни по 190 тыс товаров ((

Проверял на отдельных каталогах , где 5-6 тыс товаров. Запрос занимает в среднем 1,5-.7 секунды. У меня таких запросов два (баннер состоит из двух частей). Первая выборка 5-10 тыс товаров, вторая - очень большая.
Если страницу обновлять сразу же- то баннер быстро грузится, если раз в минуту- то до пяти секунд. это долго очень

PHP
1
2
3
4
5
6
7
8
9
10
$query01 = 'SELECT `sp_items`.`id_items`
            FROM `sp_items`, `sp_purchases` , `sp_cats` 
            WHERE  `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
            AND `sp_purchases`.`state`=0
            AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
            AND `sp_cats`.`deletecat` = 0
            And `sp_items`.`price` > 0
            AND `sp_items`.`hidden` = 0
            AND `sp_items`.`invisible` = 0
            And `sp_items`.`image_urls` <> "a:0:{}"';
Если использовать ORDER BY RAND для выборки случайных строк - он вообще умрет.
По другому не знаю как запросом выбрать 10 рандомных строк
0
 Аватар для BearBaloo
41 / 41 / 16
Регистрация: 04.10.2016
Сообщений: 154
28.10.2016, 08:36
SQL
1
ORDER BY Rand()
На таблицах с кол-вом записей превышающих 1к+ не желательно использовать, так как он для каждой записи присваивает случайное число и тд ...
Для этого есть другие методы, как к примеру отдать логкику получения рандомных значений на сторону сервера.

К примеру вы получаете максимальный айдишник записи, и генерите рандомные от 1 до MAX
Но это сработает только если в бд у вас нету пробелов(
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.10.2016, 08:54
ORDER BY RAND конечно выполняется медленно, но вытаскивать такое количество записей -- тоже не выход.

Добавлено через 1 минуту
Первое, что попалось: http://hudson.su/2010/09/16/my... r-by-rand/
1
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
28.10.2016, 13:17  [ТС]
Все это так, но вот запроса поиска рандомного с помощью максимального значения мне не подходит, поскольку в этой статье не учитываются пробелы, а у меня их, судя по длинному условию WHERE, ОООЧень много.

Может есть еще предложения?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.10.2016, 14:24
Вот такой запрос в три раза (около того) быстрее, чем просто ORDER BY RAND() в основном запросе, за счёт уточнения поля, которое выбираем:
SQL
1
2
3
4
5
SELECT * FROM `таблица`
JOIN (
    SELECT id FROM `та же таблица` ORDER BY RAND() LIMIT 10
) t2
USING(id)
Но всё равно не фонтан.
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
28.10.2016, 14:46  [ТС]
Так я и так только поле id и выбираю. Но даже на такой запрос большая нагрузка. видимо из-за большого результата.

создал тему по поводу изменения sql запроса в другом форуме, чтобы модераторы на меня не ругуались.
тут

тема с кешированием также актуальна
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.10.2016, 15:03
А если так?
SQL
1
2
3
4
5
6
/* Получение случайного значения */
SET @test = (
    SELECT FLOOR(RAND() * COUNT(id)) FROM messages
);
 
SELECT * FROM messages WHERE id >= @test LIMIT 10;
Только это дело за один запрос к базе надо выполнять.
1
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
28.10.2016, 15:46  [ТС]
SQL
1
SELECT FLOOR(RAND() * COUNT(id)) FROM messages
я с таким кодом не знаком, но мне кажется , что тут также для таблицы без пропусков....вот представьте общий список товаров , какие то товары, выборочно закончились. То есть уже есть пробелы.

или я не прав?

Добавлено через 5 минут
а можно ли как то в запросе поставить вывод например каждой сотой строки?

это будет уже в 100 раз меньше результат

Добавлено через 1 минуту
например разбить по 100 и вывести по одному результату из каждой группы
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.10.2016, 15:52
Цитата Сообщение от kupidon Посмотреть сообщение
или я не прав?
Неправы.
Цитата Сообщение от kupidon Посмотреть сообщение
а можно ли как то в запросе поставить вывод например каждой сотой строки?

это будет уже в 100 раз меньше результат
Зачем? Если Вы о времени выполнения беспокоитесь -- то бросьте это гиблое дело,-- беспокоиться. Всё и так работает быстро.
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
28.10.2016, 16:10  [ТС]
SQL
1
2
SELECT * FROM messages WHERE id >= (SELECT FLOOR(RAND() * COUNT(id)) FROM messages
)) LIMIT 10;
так?

Добавлено через 5 минут
не могу сообразить как в этот шаблон запихать мой запрос? у меня ведь из трех таблиц берутся условия

Добавлено через 7 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$query02 = 'SELECT `sp_items`.`id_items`
               FROM `sp_items`
            WHERE  `sp_items`.`id_items`>=
            (SELECT FLOOR(RAND() * COUNT(`sp_items`.`id_items`)) FROM `sp_items`, `sp_purchases` , `sp_cats` 
            WHERE  `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
            AND `sp_purchases`.`state`=0
            AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
            AND `sp_cats`.`deletecat` = 0
            And `sp_items`.`price` > 0
            AND `sp_items`.`hidden` = 0
            AND `sp_items`.`invisible` = 0
            And `sp_items`.`image_urls` <> "a:0:{}") LIMIT 10';
Добавлено через 1 минуту
так вообще 23 секунды
Помогите пожалуйста адаптировать мой запрос под ваш шаблон
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.10.2016, 16:43
Цитата Сообщение от kupidon Посмотреть сообщение
так?
Ни в коем случае. Не зря же случайное значение было вынесено в отдельную переменную. А в Вашем случае подзапрос выполнится для каждой записи.
Вот так предполагалось использовать:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* Получение случайного значения */
SET @random = (
    SELECT 
        FLOOR(RAND() * COUNT(`id_items`)) 
    FROM `sp_items`
    WHERE  `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
            AND `sp_purchases`.`state`=0
            AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
            AND `sp_cats`.`deletecat` = 0
            AND `sp_items`.`price` > 0
            AND `sp_items`.`hidden` = 0
            AND `sp_items`.`invisible` = 0
            AND `sp_items`.`image_urls` <> "a:0:{}"
);
 
SELECT `sp_items`.`id_items`
    FROM `sp_items`, `sp_purchases` , `sp_cats` 
WHERE `id_items` >= @random,
       AND `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
       AND `sp_purchases`.`state`=0
       AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
       AND `sp_cats`.`deletecat` = 0
       AND `sp_items`.`price` > 0
       AND `sp_items`.`hidden` = 0
       AND `sp_items`.`invisible` = 0
       AND `sp_items`.`image_urls` <> "a:0:{}"
LIMIT 10

Хотя с таким дублированием мне вариант перестаёт казаться подходящим. Хотя, можно ещё представление сделать.
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 07:59  [ТС]
Спасибо,что помогаете мне
Не сталкивался с таким построением вопроса.
Не могу с синтаксисом разобраться:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    $query02 = 'SET @random = (
    SELECT 
        FLOOR(RAND() * COUNT(`id_items`)) 
    FROM `sp_items`
    WHERE  `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
            AND `sp_purchases`.`state`=0
            AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
            AND `sp_cats`.`deletecat` = 0
            AND `sp_items`.`price` > 0
            AND `sp_items`.`hidden` = 0
            AND `sp_items`.`invisible` = 0
            AND `sp_items`.`image_urls` <> "a:0:{}"
)
 
 SELECT `sp_items`.`id_items`
    FROM `sp_items`, `sp_purchases` , `sp_cats` 
WHERE `id_items` >= @random,
       AND `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
       AND `sp_purchases`.`state`=0
       AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
       AND `sp_cats`.`deletecat` = 0
       AND `sp_items`.`price` > 0
       AND `sp_items`.`hidden` = 0
       AND `sp_items`.`invisible` = 0
       AND `sp_items`.`image_urls` <> "a:0:{}"
LIMIT 10';
 
      
  $res02 = $db->sql_query($query02);
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
29.10.2016, 08:03
Цитата Сообщение от kupidon Посмотреть сообщение
Не могу с синтаксисом разобраться
Скопируйте просто то, что сообщении #13 и проверьте, как работает.
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 08:36  [ТС]
Делаю запрос прямо в phpadmin тогда
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SET @random = (
    SELECT 
        FLOOR(RAND() * COUNT(`id_items`)) 
    FROM `sp_items`, `sp_purchases` , `sp_cats`
    WHERE  `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
            AND `sp_purchases`.`state`=0
            AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
            AND `sp_cats`.`deletecat` = 0
            AND `sp_items`.`price` > 0
            AND `sp_items`.`hidden` = 0
            AND `sp_items`.`invisible` = 0
            AND `sp_items`.`image_urls` <> "a:0:{}"
);
 
SELECT `sp_items`.`id_items`
    FROM `sp_items`, `sp_purchases` , `sp_cats` 
WHERE `id_items` >= @random
       AND `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
       AND `sp_purchases`.`state`=0
       AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
       AND `sp_cats`.`deletecat` = 0
       AND `sp_items`.`price` > 0
       AND `sp_items`.`hidden` = 0
       AND `sp_items`.`invisible` = 0
       AND `sp_items`.`image_urls` <> "a:0:{}"
LIMIT 10


результат:
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
29.10.2016, 08:42
Ну. При каждом запросе выборка стартовать будет со случайного значения.
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 09:00  [ТС]
во первых все товары в выборке по порядку находятся, а это значит будут все однотипные (например все носки)
во вторых- при обновлении ничего ни меняется. тот же результат
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
29.10.2016, 09:12
Цитата Сообщение от kupidon Посмотреть сообщение
во первых все товары в выборке по порядку находятся, а это значит будут все однотипные
А, ну да. Тогда это проблема.
0
 Аватар для kupidon
0 / 0 / 2
Регистрация: 21.02.2013
Сообщений: 118
29.10.2016, 09:15  [ТС]
а что если все таки разбить на группы и взять с каждой группы по одной?
Как такой запрос написать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.10.2016, 09:15
Помогаю со студенческими работами здесь

Передача результатов запроса из бд в POST
Доброго времени суток! не могу справиться с такой задачей: вывожу на печать строки из бд и помещаю их в таблицу: ...

Чтение переменных из результатов запроса
Всем доброго времени суток! Никак не получается разобраться в проблеме, очень надеюсь на Вашу помощь... У меня есть код, который должен...

Вывод результатов поискового запроса
Здравствуйте. Прошу помочь. Привожу часть кода проверки и вывода результатов поискового запроса. Всё бы хорошо, но если не ввести ничего...

Вывод результатов запроса в таблицу, в шаблон
Здравствуйте, имеется некая выборка, пусть $zapros=oci_parse($con, 'select * from dual'); oci_execute($zapros); Необходимо...

Получить ассоциативный массив из результатов запроса к БД MSSQL
Доброго всем дня! Возникла проблема с созданием ассоциативного массива, данные для которого берутся из результатов SQL-запроса к БД...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru