Подтвердить что ты не робот

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

Я пытаюсь избежать Count() из-за проблемы с производительностью. (т.е. SELECT COUNT() FROM Users)

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

4b9b3361

Ответ 1

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

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

SELECT SQL_CALC_FOUND_ROWS * FROM Users;

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

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

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

SELECT count(*) FROM users;

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

Ответ 2

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

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

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

Ответ 3

Это распространенное заблуждение, что 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() sends a unique query (multiple queries are not supported)

Несколько запросов поддерживаются при использовании ext/mysqli в качестве расширения MySQL:

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

Ответ 4

Используйте 'union' и пустые столбцы:

$sql="(select sql_calc_found_rows tb.*, tb1.title
      from orders tb
           left join goods tb1 on tb.goods_id=tb1.id
      where {$where}
      order by created desc
      limit {$offset}, {$page_size})
      union
      (select found_rows(), '', '', '', '', '', '', '', '', '')
     ";
$rs=$db->query($sql)->result_array();
$total=array_pop($rs);
$total=$total['id'];

Ответ 5

Только этот код работает для меня, поэтому я хочу поделиться им для вас.

$Result=mysqli_query($i_link,"SELECT SQL_CALC_FOUND_ROWS  id From users LIMIT 10"); 
$NORResult=mysqli_query($i_link,"Select FOUND_ROWS()"); 
$NORRow=mysqli_fetch_array($NORResult); 
$NOR=$NORRow["FOUND_ROWS()"]; 
echo $NOR;

Ответ 6

Это простой способ и работает для меня:

$query = "
SELECT SQL_CALC_FOUND_ROWS * 
FROM tb1
LIMIT 5";

$result = mysqli_query($link, $query);

$query = "SELECT FOUND_ROWS() AS count";
$result2 = mysqli_query($link, $query);

$row = mysqli_fetch_array($result2);

echo $row['count'];

Ответ 7

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