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

Solutions Collecting From Web of "Как использовать MySQL Found_Rows () в 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() sends a unique query (multiple queries are not supported)

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

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

Используйте «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']; 

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

 $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; 

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

 $query = " SELECT SQL_CALC_FOUND_ROWS * FROM tb1 LIMIT 5"; $result = mysql_query($query); $query = "SELECT FOUND_ROWS() AS count"; $result2 = mysql_query($query); $row = mysql_fetch_array($result2); echo $row['count']; 

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