Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить количество полей в таблице. Скорость критична (1,5млн записей) 
V
    Опции темы
Koresh
Дата 1.8.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Доброго времени суток всем!
Столкнулся со следующей проблемой. Есть база данных (даже 2) в одной полтора миллиона записей, вторая поменьше, где-то 200 тысяч. В общем нужно получить количество и вывести его. Делаться должно быстро. Так вот я, начитавшись всяких мануалов наивно, надеясь на скорость сделал так:
Код

  $sql='SELECT COUNT(*) FROM files';  
  $count=mysql_query($sql,$connect);
  $files=mysql_result($count, 0, 0);

В результате получил время выполнения скрипта 6 секунд, что ОЧЕНЬ плохо. Я уже думла быстрое получение нереально, НО в PHP My Admin при введении такого простого запроса как:
Код

SELECT * 
FROM `files` 
LIMIT 0 , 30

он же как-то выводит информацию:" Показывает записи 0 - 29 (1,491,259 всего, Запрос занял 0.0008 сек)". Собственно такого времени выполнения мне бы хватило, да и количество получается. По всей видимости обрабатывается запрос, без буферизации. Может кто подскажет как это сделать? И ещё вопросик, в MyAdmin количество при каждом нажатии на кнопку разное... собственно конечно тут точность не так критична... но хотелось бы получить точную цифру.

PM MAIL   Вверх
Gold Dragon
Дата 1.8.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Koresh, смотри здесь, только что обсуждали 

http://forum.vingrad.ru/index.php?showtopic=105364


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Koresh
Дата 1.8.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



To Gold Dragon: Я извиняюсь за назойливось, но я прочитал все схожие темы, включая и ту, на которую ты дал линк. Но если я правильно понял, то то что там изложено предлагает опять таки 
Код

$sql='SELECT COUNT(*) FROM files'; 
$count=mysql_query($sql,$connect);
$files=mysql_result($count, 0, 0);

как оптимал. Но ведь PHP My Admin получает как-то в 10 раз быстрее??? Хотелось бы узнать как. И ещё - вопрос с "плавающим" значением количество в том же админе остался в силе
PM MAIL   Вверх
Gold Dragon
Дата 1.8.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



'SELECT COUNT(*) FROM files - в любом случае будет работать быстрее если больше ни каких условий в запросе не будет. Если будет, то скорость уже не гарантирована... А почему у тебя так? Ну может что-то в настройках сервера...


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Koresh
Дата 1.8.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Так вот весьма интересно, почему собственно не так. MySQL 5 версии (угораздило кому-то поставить...)... Просто интересно, кто-нибудь может сказать, сколько реально должро получаться количество с таким размером базы.
PM MAIL   Вверх
skyboy
Дата 1.8.2006, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Иди в схему information_schema и ищи в таблице tables нужную таблицу в требуемой схеме. Вытягивай значение поля table_rows. Вот так:
Код

SELECT TABLE_ROWS  FROM `information_schema`.`TABLES`  WHERE table_schema='your_schema' AND table_name='your_name'

КАк я понимаю, оптимизатор так и должен определять count(*), если не задано условий. Даже не знаю, почему так не происходит...

Это сообщение отредактировал(а) skyboy - 1.8.2006, 23:47
PM MAIL   Вверх
Koresh
Дата 2.8.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Всем спасибо за ответы, проблему решил таким образом:
Код

  $sql='SHOW TABLE STATUS FROM finder';
  $count=mysql_query($sql,$connect);
  while ($array = mysql_fetch_array($count))
  {
      if ($array[0]=='files')
      {
          $files=$array[4];
      }
     
  }


Но вот проблема с "плавающим" значением осталась. При нажатии на кнопк обновить, значение изменяется +- 5000  smile
PM MAIL   Вверх
Ignat
Дата 2.8.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Koresh @  2.8.2006,  01:02 Найти цитируемый пост)
значение изменяется +- 5000

Хм... Проверил. Правда так smile

Цитата(skyboy @  2.8.2006,  00:45 Найти цитируемый пост)
Иди в схему information_schema и ищи в таблице tables нужную таблицу в требуемой схеме. Вытягивай значение поля table_rows.

Кстати, тоже дает среднепотолочную погрешность smile

По вопросу пока ничего не выгуглил.


--------------------
Теперь при чем :P
PM   Вверх
Koresh
Дата 10.8.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.5.2006

Репутация: нет
Всего: нет



Сорри за опоздалый ответ - разобрался давно. При переходе с типа таблицы InnoBD на MyIsam проблема ушла сама собой. При получении количества через COUNT запрос работает с нужной скоростью (даже больше нужной smile сотые доли секунды) и точно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0755 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.