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