Народ, подскажите плиз, как лучше хранить данные о количестве строк в таблице? Ситуация Есть несколько таблиц с некими объектами, в каждой из них около 500-600 тысяч строк, со временем эта цифра увеличивается. На тривиальный SELECT `id` FROM `objects` и mysql_num_rows() каждой таблицы уходит порядка 0,2-0,5 секунды, на мой взгляд - расточительство. Я подумал, может завести таблицу, в которую писать при обновлении каждой таблицы число ее строк? Как вообще такая проблема решается оптимальнее?
Русланчек Какие типы таблиц? MyISAM? InnoDB? Юзай [sql]SELECT count(*) FROM `table_name`[/sql] И господь сказал: возрадуйся!
Ну, например, форум phpbb количество сообщений в каждой теме, количество тем в каждом форуме и т.п. - хранит в б.д., а не пересчитывает при каждом обращении. Это работает быстрее, конечно.
Забыл: Заюзай алиасы для простоты обработки. Например: [sql]SELECT count(*) AS `records` FROM `table_name`[/sql] и РНР соответственно: Код (Text): $row->records
Да хоть миллиардниках. Есть понятие индексов, есть понятие первичных ключей. Эта информация хранится отдельно от таблицы с записями, разработчики MySQL конструкцию вызов функции count(*) сделали конструкцией языка по сути, оптимизировав её для быстрой выборки количества записей. Сравни count(*) с count(id) и убедишься, насколько первый обгоняет.
Структура таблицы: [sql]CREATE TABLE `codes` ( `code_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `code` VARCHAR(12) NOT NULL DEFAULT '', `code_used` DATETIME DEFAULT NULL, PRIMARY KEY(`code_id`), KEY(`code`) ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;[/sql] В таблице 4 000 002 записи На сервере, конечно быстрее, но всё равно не мгновенно, а на локалхосте - вообще жесть: [sql]SELECT COUNT(*) FROM `codes`;[/sql] 4000002 1 row in set (1 min 16.55 sec) [sql]SELECT COUNT(*) FROM `codes`;[/sql] 4000002 1 row in set (1 min 15.33 sec) [sql]SELECT COUNT(*) FROM `codes` WHERE `code_id` < 99999999;[/sql] 4000002 1 row in set (9.83 sec) - любопытно, почему? [sql]SELECT COUNT(`code_id`) FROM `codes`;[/sql] 4000002 1 row in set (1 min 16.13 sec)
Да я и не говорю, что такого не должно быть Мне просто любопытно, почему с условием, под которое попадают все записи пересчёт строк выполняется в несколько раз быстрее, чем без условия
sobachnik Потому что инфа о кколичестве строк в майсам хранится отдельно, а если есть условие - выполняется проход по строкам. В ИнноДб все не так)