Я стараюсь не проводить подсчет () из-за проблемы производительности. (т.е. ВЫБЕРИТЕ КОЛИЧЕСТВО () ОТ Пользователей),
Если я выполняю followings в phpMyAdmin, он в порядке:
SELECT SQL_CALC_FOUND_ROWS * FROM Users;
SELECT FOUND_ROWS();
Это возвратит # строк. т.е. # Пользователей.
Однако, если я работаю в в PHP, я не могу сделать этого:
$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users;
SELECT FOUND_ROWS(); ';
mysql_query($query);
Кажется, что PHP не нравится иметь две передачи запросов в. Так, как я могу сделать это?
SQL_CALC_FOUND_ROWS
полезен только в том случае, если вы используете предложение LIMIT
, но все же хотите знать, сколько строк было бы найдено без LIMIT
.
Подумайте, как это работает:
SELECT SQL_CALC_FOUND_ROWS * FROM Users;
Вы заставляете базу данных извлекать / анализировать ВСЕ данные в таблице, а затем выбрасываете их. Даже если вы не собираетесь извлекать какие-либо строки, сервер БД все равно начнет извлекать фактические данные с диска, предполагая, что эти данные вам понадобятся.
Говоря человеческим языком, вы купили все содержимое супермаркета, но выбросили все, кроме упаковки жевательной резинки, с прилавка у кассира.
Принимая во внимание, что выполнение:
SELECT count(*) FROM users;
позволяет механизму БД знать, что, хотя вы хотите знать, сколько там строк, вы не заботитесь о фактических данных. В большинстве любых интеллектуальных СУБД механизм может получить это количество из метаданных таблицы или простым прогоном по индексу первичного ключа таблицы, даже не касаясь данных строки на диске.
Два его запроса:
$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users';
mysql_query($query);
$query = 'SELECT FOUND_ROWS()';
mysql_query($query);
PHP может выдавать только один запрос для каждого вызова mysql_query
Распространенное заблуждение, что SQL_CALC_FOUND_ROWS работает лучше, чем COUNT (). См. Это сравнение от ребят из Percona: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
Чтобы ответить на ваш вопрос: только один запрос разрешено для одного вызова mysql_query, как описано в руководстве: mysql_query () отправляет уникальный запрос (несколько запросов не поддерживаются)
Поддерживаются несколько запросов при использовании ext / mysqli
в качестве расширения MySQL :
Вы действительно думаете, что выбор ВСЕХ строк из таблиц выполняется быстрее, чем их подсчет?
Myisam хранит ряд записей в метаданных таблицы, поэтому таблица SELECT COUNT (*) FROM не требует доступа к данным.