2012-05-16 2 views
1

Недавно я написал приложение для опроса, которое выполнило его работу, и все данные собраны. Теперь я должен проанализировать данные, и у меня есть некоторые проблемы времени. Мне нужно выяснить, сколько людей выбрали вариант и отобразить все.Оптимизация запроса MYSQL COUNT ORDER BY

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

SELECT COUNT(*) 
    FROM survey 
WHERE users = ? AND table = ? AND col = ? AND row = ? AND selected = ? 
GROUP BY users,table,col,row,selected 

Как видно по «?» Я использую MySQLi (в php) для получения данных, когда это необходимо, но я боюсь, что это заставляет его быть настолько медленным.

Таблица состоит из всех элементов выше (+ уникальный идентификатор), и все они являются целыми числами. Чтобы объяснить некоторые из полей: Каждый опрос был разделен на 3 или 4 таблицы (размером от 2x3 до 5x5) с оценкой счастья от 1 до 10 для выбора формы. (Вопросы находятся справа и верхней части таблицы, то вы ответите, где вопросы пересекаются)

пользователей - возрастные группы

таблица, строка, столбец - пояснялось выше

выбрано - dooooh пояснялось выше

Теперь, когда опросы завершены и около 1 миллиона записей в таблице, запрос становится очень медленным. Иногда это занимает примерно 3 минуты, иногда (я думаю) истекает срок, и вы не получаете никаких данных. У меня также нет доступа к полной базе данных, просто мой пустой «тестовый», поскольку заказчик выглядит как параноидальный: S (и его сервер кажется немного медленным)

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

Я читал где-то, что индексирование может помочь группам, но только если вы группируете первые столбцы в таблице (и поскольку мой идентификатор является первым и с моей точки зрения бесполезным, я могу удалить его и получить что-нибудь от него?)

Есть ли другой способ написать мой запрос, который будет в основном делать то же самое, но в более короткий период времени?

Спасибо за все ваши предложения заранее!

+1

Я бы определенно добавлял индексы к столбцам: пользователям, таблице, столбцу, строке и выбранным. Это должно улучшить время, затрачиваемое на выполнение запроса. –

ответ

2

Добавьте указатель на записи, которые вы «GROUP BY» или «WHERE». Таким образом, это ONE-индекс, включающий пользователей, таблицу, столбец, строку и выбранный в вашем случае.

Некоторые быстрые правила:

  • объединить поля, чтобы иметь где впервые, и GROUP BY элементов последних.
  • Если у вас есть другие запросы, в которых используется только часть (например, пользователи, таблица, столбцы и выбранные), то оставить последнее значение (строка в этом примере) последним.

Не используйте слишком много индексов/индексов, так как каждый из них замедляет работу таблицы до минимальной величины - так что на действительно большой системе вам нужно балансировать запросы с индексами.


Редактировать: вам нужен пользователь GROUP BY, col, row, поскольку они используются в WHERE. Если WHERE уже отфильтровал их, вам нужна группа только по «selected».

+0

мог бы получить что-нибудь, сделав что-то вроде: – user1398269

+0

спасибо за помощь. Получил бы я что-нибудь, переписав запрос на что-то вроде: SELECT selected, COUNT (выбрано) WHERE .... и пусть петля php выйдет из системы. Тогда индекс не будет применяться, не так ли? (они появляются один за другим на странице). (epic fail on the shift-enter вещь на этом форуме: D) – user1398269

+0

Если они вам нужны, SELECT users, table, col, row, selected, COUNT (*) FROM survey GROUP BY users, table, col, row, выбранный является вашим лучшим вариантом (с индексом) и будет ускорять работу. Проведите все результаты. – Robbie

Смежные вопросы