Как использовать MySQL Found_Rows () в PHP? - PullRequest
23 голосов
/ 11 августа 2010

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

Ответы [ 7 ]

28 голосов
/ 11 августа 2010

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

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

SELECT SQL_CALC_FOUND_ROWS * FROM Users;

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

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

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

SELECT count(*) FROM users;

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

23 голосов
/ 11 августа 2010

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

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

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

5 голосов
/ 11 августа 2010

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

3 голосов
/ 08 сентября 2015

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

$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'];
3 голосов
/ 06 мая 2015

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

$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;
3 голосов
/ 16 октября 2014

Используйте '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'];
0 голосов
/ 11 августа 2010

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

...