Комментарии 46
как бы зависит от движка (InnoDB vs MyISAM).
имхо лучший выход — вешать триггеры на INSERT/DELETE и править метаданные таблицы.
имхо лучший выход — вешать триггеры на INSERT/DELETE и править метаданные таблицы.
-2
Не совсем понятно зачем нужны триггеры?
0
в INSERT увеличиваем внутренний счетчик, в DELETE — уменьшаем.
потом просто выводим данные этого счетчика, когда нужно узнать количество записей.
потом просто выводим данные этого счетчика, когда нужно узнать количество записей.
0
А первый простейший вариант чем плох?
+2
Первый вариант оптимизирован только для MyIsam таблиц, для InnoDB он также по индексу будет идти и считать.
+1
Вы думаете разработчики БД не учли это и тупо не возращают количество записей в индексе?
0
в myisam количество строк хранится отдельно, в innodb надо посчитать сколько записей в индексе. с учетом того, что первичный индекс — кластерный, это может быть очень не быстрым делом.
+1
А еще в случае наличия прав доступа на уровне строк, то нужно подсчитать число строк доступных данному пользователю…
0
Они это учли и не возращают тупо количество записей в индексе, т.к. это количество не всегда совпадает с количеством строк из-за транзакций и т.п.
+1
одно дело взять данные из метадаты таблицы, которые _всегда_ в памяти, другое — обращаться к дереву индексов, и смотреть сколько там элементов.
первое — либо быстрее, либо так же по скорости.
первое — либо быстрее, либо так же по скорости.
0
А если DELETE не одной записи?
0
Обращаю внимание, что SHOW TABLE STATUS FROM database WHERE Name = 'table'; для InnoDB возвращает примерное значение.
+3
SELECT COUNT(*) FROM table WHERE is_delete = 0
-10
Заранее прошу прощения если вопрос покажется глупым, но в чем принципиальное различие между первым и вторым вариантом? Второй работает быстрее?
+11
Единственно когда мне надо знать общее количество записей — это при использовании limit.
Догадайтесь с одного раза как это сделать в мискле.
Догадайтесь с одного раза как это сделать в мискле.
+1
Насколько я помню, SELECT COUNT(ID) FROM table; (или любое другое поле) быстрее, чем *
+8
NULL значения не подсчитаются.
0
Но, честно говоря, спасибо за коментарий. У меня был изначально этот вариант в списке, но я решил не плодить так много вариантов.
0
с чего бы это? count(*) — специальная форма записи для подсчета количества строк, а не значений
0
Всё с точностью до наоборот.
0
Давайте уточним — это обычно истинно для MS SQL Server т.к. по PK строится индекс.
В общем сценарии\ произвольной бд это может и не выполняться быстрее.
В общем сценарии\ произвольной бд это может и не выполняться быстрее.
0
SELECT SQL_CALC_FOUND_ROWS… FROM дальше_обычный_запрос
Правда это не для всей таблицы, а для конкретного запроса.
Узнавать количество для всей таблицы как-то не было надобности.
Правда это не для всей таблицы, а для конкретного запроса.
Узнавать количество для всей таблицы как-то не было надобности.
+3
То есть и вернуть все записи и построить пагинатор.
Принимается.
А как в PostgreSQL это сделать?
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
Принимается.
А как в PostgreSQL это сделать?
+1
Нативного такого говорят что нет. Но можно сэмулировать.
valera.ws/2008.07.24~calc-found-rows-in-postgresql/
stackoverflow.com/questions/3373233/is-there-a-similar-function-in-postgresql-for-mysqls-sql-calc-found-rows
valera.ws/2008.07.24~calc-found-rows-in-postgresql/
stackoverflow.com/questions/3373233/is-there-a-similar-function-in-postgresql-for-mysqls-sql-calc-found-rows
0
Нативного такого говорят нет. Но можно сэмулировать.
http://valera.ws/2008.07.24~calc-found-rows-in-postgresql/
stackoverflow.com/questions/3373233/is-there-a-similar-function-in-postgresql-for-mysqls-sql-calc-found-rows
http://valera.ws/2008.07.24~calc-found-rows-in-postgresql/
stackoverflow.com/questions/3373233/is-there-a-similar-function-in-postgresql-for-mysqls-sql-calc-found-rows
0
Учтите, что SQL_CALC_FOUND_ROWS иногда медленнее, чем два отдельных запроса.
+2
Первый способ работает везде. Остальные от вариации поддержки стандарта и вендор специфик.
+8
Небыло моего варианта! :)
select reltuples from pg_class where relname='table';
select reltuples from pg_class where relname='table';
0
НЛО прилетело и опубликовало эту надпись здесь
Судя по комментариям, мир SQL ограничивается двумя видами таблиц MySQL :-)
0
Вопрос заинтриговал:
SELECT COUNT(*) FROM `таблица`
starting 0.000007
checking query cache for query 0.000005
checking privileges on cached 0.000003
sending cached result to clien 0.000016
logging slow query 0.000002
cleaning up 0.000001
SELECT COUNT(*) FROM `таблица` LIMIT 1
starting 0.000007
checking query cache for query 0.000004
checking privileges on cached 0.000002
sending cached result to clien 0.000016
logging slow query 0.000002
cleaning up 0.000001
База 46,786,533 записей типа MyISAM объем 18.1 ГБ, при тестах нагрузка на сервер снята, т.е. оба результата сопоставимы. ИМХО большой разницы не увидел.
SELECT COUNT(*) FROM `таблица`
starting 0.000007
checking query cache for query 0.000005
checking privileges on cached 0.000003
sending cached result to clien 0.000016
logging slow query 0.000002
cleaning up 0.000001
SELECT COUNT(*) FROM `таблица` LIMIT 1
starting 0.000007
checking query cache for query 0.000004
checking privileges on cached 0.000002
sending cached result to clien 0.000016
logging slow query 0.000002
cleaning up 0.000001
База 46,786,533 записей типа MyISAM объем 18.1 ГБ, при тестах нагрузка на сервер снята, т.е. оба результата сопоставимы. ИМХО большой разницы не увидел.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как вы узнаёте количество записей в таблице?