Выполнение запросов к таблицам с более чем 1 миллионом строк в - PullRequest
5 голосов
/ 07 мая 2011

Я индексирую все столбцы, которые я использую в своем Where / Order, есть ли что-нибудь еще, что я могу сделать, чтобы ускорить запросы?

Запросы очень просты, например:

SELECT COUNT(*) 
  FROM TABLE 
 WHERE user = id 
   AND other_column = 'something'`

Я использую PHP 5, версия клиента MySQL: 4.1.22 и мои таблицы MyISAM.

Ответы [ 2 ]

7 голосов
/ 07 мая 2011

Поговорите со своим администратором базы данных.Запустите ваш локальный эквивалент showplan.Для запроса, подобного вашему примеру, я подозреваю, что индекс покрытия для столбцов id и other_column значительно повысит производительность.(Я предполагаю, что user является переменной или нильадной функцией.)

Хорошее общее правило - столбцы в индексе должны идти слева направо в порядке убывания дисперсии.То есть этот столбец, который изменяется наиболее быстро по значению, должен быть первым столбцом в индексе, а тот столбец, который изменяется наименее быстро, должен быть последним столбцом в индексе.Кажется, противоречит интуитивно, но вы идете.Оптимизатору запросов нравится как можно быстрее сужаться.

1 голос
/ 07 мая 2011

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

Таким образом, ваши индексы могут быть:

user + otherfield1
user + otherfield2
etc.

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

Что приятно в поле "пользователь + другое""index - это то, что mysql даже не нужно просматривать записи данных.Индекс имеет указатель для каждой записи и может просто подсчитывать указатели.

...