GROUP BY и ORDER BY слишком медленные.Как сделать быстрее? - PullRequest
2 голосов
/ 24 июля 2011

Я пытаюсь создать статистику для своей таблицы, но в ней более 3 миллионов строк, поэтому она действительно медленная.

Я пытаюсь найти наиболее популярное значение для столбца name, а такжепоказывая, сколько раз он появляется.

Я использую это в момент, но он не работает, потому что он слишком медленный, и я просто получаю ошибки.

    $total = mysql_query("SELECT `name`, COUNT(*) as b FROM `people` GROUP BY `name` ORDER BY `b` DESC LIMIT 0,5;")or die(mysql_error());

Как вы можетевидите, я пытаюсь получить все имена и сколько раз это имя использовалось, но показываю только первые 5, чтобы надеяться ускорить его.

Я хотел бы иметь возможность получить такие значения, как

   while($row = mysql_fetch_array($result)){
        echo $row['name'].': '.$row['b']."\r\n";
   }

И это покажет такие вещи;

  Bob: 215
  Steve: 120
  Sophie: 118
  RandomGuy: 50
  RandomGirl: 50

Меня не сильно волнует порядок названий впоследствии, как RandomGirl и RandomGuy, были неправильным способом.

Я думаю, что предоставил достаточно информации.:) Я хотел бы, чтобы имена были без учета регистра, если это возможно.Боб должен быть таким же, как БоБ, БОБ, БОБ и т. Д.

Спасибо за потраченное время Пол

Ответы [ 3 ]

5 голосов
/ 24 июля 2011

Ограничение результатов в топ-5 не даст вам большого ускорения, вы получите время на получение результатов, но на стороне MySQL вся таблица все еще должна быть проанализирована (для подсчета).

Вы ускорите запрос на подсчет, имеющий индекс по столбцу имени, разумеется, поскольку будет проанализирован только индекс, а не таблица.

Теперь, если вы действительно хотите ускорить результат и не анализировать индекс имени, когда вам нужен этот результат (который все еще будет довольно медленным, если у вас действительно есть миллионы строк), тогда единственное другое решение - это вычисление статистики, когда вставка, удаление или обновление строк в этой таблице. То есть с помощью триггеров в этой таблице ведется таблица статистики рядом с этой. Тогда у вас будет только простой запрос на выборку в этой статистической таблице, с разбором только 5 строк. Но вы замедляете операции вставки, удаления и обновления (которые уже довольно медленные, особенно если вы поддерживаете индексы, поэтому, если статистика важна, вам следует изучить это решение).

2 голосов
/ 24 июля 2011

У вас есть индекс на имя?Это может помочь.

1 голос
/ 24 июля 2011

Так как вы делаете подсчет / группирование, а затем сортируете индекс по имени, это совсем не помогает, MySql должен каждый раз проходить по всем строкам, оптимизировать это невозможно. Вам нужна отдельная таблица stats , например:

CREATE TABLE name_stats( name VARCHAR(n), cnt INT, UNIQUE( name ), INDEX( cnt ) )

и вам следует обновлять эту таблицу всякий раз, когда вы добавляете новую строку в таблицу 'people', например:

INSERT INTO name_stats VALUES( 'Bob', 1 ) ON DUPLICATE KEY UPDATE cnt = cnt + 1;

Запрос этой таблицы на список топ-имен должен мгновенно дать вам результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...