Как быстрее всего получить кол-во результатов (MySQL)?

12
[Удален]
#11
Борисович:
'SELECT count(*) будет работать медленее чем 'SELECT * так как count() будет считать все ключи а * обратится в примари, и сразу получит значение.

время на выделение ресурсов вы в расчет не берете?

Таггу x_x
На сайте с 31.10.2005
Offline
445
#12

Не знаю что работает быстрее, но по крайней мере так элегантнее.

$sql = "SELECT COUNT(*) as TOTAL FROM table WHERE ...";

$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($result)
$total=$row["TOTAL"];
☠️☠️☠️
N
На сайте с 06.05.2007
Offline
419
#13

MOP1, да не будет count(*) лишние ключи проверять, просто товарищ спутал с каким-то другим случаем.

Кнопка вызова админа ()
[Удален]
#14

Ссори, с просони на ляпал ))

Для подсчета кол-ва строк используйте функцию COUNT(*), c указанием "звездочки" в качестве аргумента.

Почему COUNT(*) обычно быстрее COUNT(id), поясню на примере:

Есть таблица message: id | user_id | text
с индексом PRIMARY(id), INDEX(user_id)

Нам надо подсчитать сообщения пользователя с заданым $user_id

Сравним 2 запроса:

SELECT COUNT(*) FROM message WHERE user_id = $user_id

и

SELECT COUNT(id) FROM message WHERE user_id = $user_id

Оптимизация запросов в MySQL

N1k
На сайте с 11.02.2007
Offline
197
N1k
#15
netwind:
если серия запросов затрагивает весь диапазон, то будет выгодно одним запросом, иначе даже 10 мелких могут быть быстрее одного ( ну конечно если там есть индекс по s1).

Да затрагивает весь... ~20 запросов. Что-то типа разделов (от-до). COUNT(*) установил, работать стал наглядно быстрее, хотя все равно разница с страницами без таких запросов велика. Индекса нет.

netwind:
select sum( if(s1 >= 72 and s1 <= 89,1,0)) as s_72_89, sum(if (s1 >= 90 and s1 <= 95,1,0) as s_90_95

А как в таком случаи можно будет пользучить результат? (для вывода)

Сенкс за ссылку, буду читать...

N
На сайте с 06.05.2007
Offline
419
#16

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

R1
На сайте с 01.04.2006
Offline
93
#17
N1k:
Запросов много. Стоит такой код, но уже не справляется:

Говорят что через SELECT COUNT(*), в 10 раз быстрее~. Нашел в таком духе:
Но он не работает, вместо значения $result влезает "Array". 😒
Я, наверное, где-то накосячил?...

а попробуйте сделать так

$result1= @mysql_query("SELECT id FROM table WHERE ...);

$result=@mysql_num_rows($result1);

id - ключевое поле

N1k
На сайте с 11.02.2007
Offline
197
N1k
#18

Попробовал в одну сторочку через sum() вытянуть...

netwind:
select sum( if(s1 >= 72 and s1 <= 89,1,0)) as s_72_89, sum(if (s1 >= 90 and s1 <= 95,1,0) as s_90_95

Значения (как я понял в виде после AS (s_72_89, ...), так получить и не удалось с обработкой (mysql_fetch_array, mysql_fetch_assoc, ...) и без. Хотя SQL ошибок и не выдала... (-

N
На сайте с 06.05.2007
Offline
419
#19

N1k, в мануале масса примеров . это рутина. а запрос отладьте без php сначала, а то вы все равно ошибки гасите через @

MR
На сайте с 05.04.2008
Offline
14
#20

Борисович, нифига не так

как уже сказали,


count(*) считает по index, тоесть мускул сам кеширует количество записей

а SELECT * будет выбирать значение всех полей таблицы.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий