Как использовать MySQL Found_Rows () в PHP?

Я стараюсь не проводить подсчет () из-за проблемы производительности. (т.е. ВЫБЕРИТЕ КОЛИЧЕСТВО () ОТ Пользователей),

Если я выполняю 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 не нравится иметь две передачи запросов в. Так, как я могу сделать это?

23
задан murvinlai 10 August 2010 в 21:59
поделиться

4 ответа

SQL_CALC_FOUND_ROWS полезен только в том случае, если вы используете предложение LIMIT , но все же хотите знать, сколько строк было бы найдено без LIMIT .

Подумайте, как это работает:

SELECT SQL_CALC_FOUND_ROWS * FROM Users;

Вы заставляете базу данных извлекать / анализировать ВСЕ данные в таблице, а затем выбрасываете их. Даже если вы не собираетесь извлекать какие-либо строки, сервер БД все равно начнет извлекать фактические данные с диска, предполагая, что эти данные вам понадобятся.

Говоря человеческим языком, вы купили все содержимое супермаркета, но выбросили все, кроме упаковки жевательной резинки, с прилавка у кассира.

Принимая во внимание, что выполнение:

SELECT count(*) FROM users;

позволяет механизму БД знать, что, хотя вы хотите знать, сколько там строк, вы не заботитесь о фактических данных. В большинстве любых интеллектуальных СУБД механизм может получить это количество из метаданных таблицы или простым прогоном по индексу первичного ключа таблицы, даже не касаясь данных строки на диске.

28
ответ дан 29 November 2019 в 01:04
поделиться

Два его запроса:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users';
mysql_query($query);
$query = 'SELECT FOUND_ROWS()';
mysql_query($query);

PHP может выдавать только один запрос для каждого вызова mysql_query

23
ответ дан 29 November 2019 в 01:04
поделиться

Распространенное заблуждение, что 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 :

http://www.php.net/manual/en/mysqli.multi-query.php

5
ответ дан 29 November 2019 в 01:04
поделиться

Вы действительно думаете, что выбор ВСЕХ строк из таблиц выполняется быстрее, чем их подсчет?
Myisam хранит ряд записей в метаданных таблицы, поэтому таблица SELECT COUNT (*) FROM не требует доступа к данным.

0
ответ дан 29 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: