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