[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация выборки с count
eXaM
Имеем таблицу с boolean полем. Необходимо вывести, сколько у нас строк с 1 в этом поле, а сколько с 0. Как правильней построить взаимодействие с БД? Движок MyISAM, а он, насколько я помню, хранит count(*) или что-то подобное, так что, наверное, оптимальней сделать что-то в духе
SELECT COUNT(*) as `count` FROM `my_table`;
SELECT COUNT(*) as `count_true` FROM `my_table` WHERE `bool_val`=1;

Но все равно выходит, что нужно сделать два запроса. Можно ли это как-то оптимизировать? При помощи субзапросов или еще как-нибудь. Дело в том, что значения эти выводятся на каждой странице сайта (в шапке) и количество обращений к MySQL хотелось бы сократить. Смотрел еще в сторону кеширования (напрашивающееся решение, т.к. цифры эти изменяются не очень часто), но не уверен, что обращения к файлу не окажутся медленней.
FatCat
Цитата (eXaM @ 27.07.2014 - 22:44)
Смотрел еще в сторону кеширования (напрашивающееся решение, т.к. цифры эти изменяются не очень часто), но не уверен, что обращения к файлу не окажутся медленней.

Кешировать в другую таблицу в БД?

_____________
Бесплатному сыру в дырки не заглядывают...
Shuriken
Цитата (FatCat @ 27.07.2014 - 21:57)
Кешировать в другую таблицу в БД?

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

А по теме: не пробовал использовать UNION ALL? Запроса остаётся 2, но обращение одно.
T1grOK
Цитата (Shuriken @ 28.07.2014 - 07:47)
А по теме: не пробовал использовать UNION ALL?

Жуть...если на то пошло то:
SELECT (SELECT COUNT(*) as `count` FROM `my_table`) AS total_count,
(
SELECT COUNT(*) as `count_true` FROM `my_table` WHERE `bool_val`==1) AS bool_true_count



_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
sergeiss
Цитата (eXaM @ 27.07.2014 - 23:44)
WHERE `bool_val`==1

Почему пишешь "двойное равно"? В Мускуле нет такого.

Если данных много, а подсчет нужен постоянно (и на это уходит некоторое время), то более правильно будет сделать триггеры вставки/апдейта/удаления, которые при добавлении новых записей, удалении и изменении состояния твоей "булевой величины" будут изменять некие счетчики, записанные в другой таблице. А ты будешь не считать каждый раз, а просто считывать данные из этой таблицы.
Тоже своего рода кэш, только максимально качественный для данной ситуации.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
eXaM
Цитата (FatCat @ 27.07.2014 - 22:57)
Цитата (eXaM @ 27.07.2014 - 22:44)
Смотрел еще в сторону кеширования (напрашивающееся решение, т.к. цифры эти изменяются не очень часто), но не уверен, что обращения к файлу не окажутся медленней.

Кешировать в другую таблицу в БД?

Не совсем, я имел в виду механизм, когда выполняется кеширование на стороне сервера. То есть один раз запросили несколькими запросами наши count'ы, сохранили данные в файл и потом берем эти цифры из файла, а не из БД. Не знаю, правда, даст ли такой подход прирост производительности.

Цитата (sergeiss)
Почему пишешь "двойное равно"? В Мускуле нет такого.

Мы писали, мы писали, наши мозжечки устали biggrin.gif опечатался, исправил smile.gif

Цитата (sergeiss)
Если данных много, а подсчет нужен постоянно (и на это уходит некоторое время), то более правильно будет сделать триггеры вставки/апдейта/удаления, которые при добавлении новых записей, удалении и изменении состояния твоей "булевой величины" будут изменять некие счетчики, записанные в другой таблице. А ты будешь не считать каждый раз, а просто считывать данные из этой таблицы.
Тоже своего рода кэш, только максимально качественный для данной ситуации.

Данных немного, буквально сотня-другая записей от силы. Дело в том, что сайт этот я делаю для благотворительной организации и хотелось бы максимально сэкономить ресурсы, чтобы и без того весьма скудный бюджет шел на дело, а не на дорогой хостинг. Итак, учитывая небольшие объемы данных, стоит ли вообще как-то заморачиваться с кешированием или просто делать два запроса?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.