Добавление полей для оптимизации запросов MySQL

У меня есть таблица MySQL с 3 полями:

  • Место нахождения
  • переменная
  • Значение

Я часто использую следующий запрос:

SELECT * 
  FROM Table 
 WHERE Location = '$Location' 
   AND Variable = '$Variable' 
ORDER BY Location, Variable

У меня в таблице более миллиона строк, и запросы выполняются несколько медленно. Будет ли это увеличить скорость запроса, если я добавлю поле VariableLocationКакая переменная и Местоположение объединены? Я мог бы изменить запрос на:

SELECT * 
  FROM Table 
 WHERE VariableLocation = '$Location$Variable' 
ORDER BY VariableLocation

4 ответа

Решение

Исправление Обновление:

Вежливость: @paxdiablo:

Столбец в таблице не будет иметь никакого значения. Все, что вам нужно, это индекс по обоим столбцам, и движок MySQL будет его использовать. Добавление столбца в таблицу на самом деле хуже, чем это, поскольку это нарушает 3NF и тратит пространство. См. http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html котором говорится: SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; Если для столбцов col1 и col2 существует индекс с несколькими столбцами, соответствующие строки можно получить напрямую.

Я бы добавил индекс покрытия, для столбцов location а также variable:

ALTER TABLE 
  ADD INDEX (variable, location);

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

Объединение столбцов, скорее всего, вызовет больше горя, чем оно того стоит. Например, если вам нужно вытащить записи location или же variable только вам нужно подстроку значений в подзапросе.

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

Я бы посоветовал не объединять поля. Вместо этого создайте индекс, который охватывает оба поля в том же порядке, что и предложение ORDER BY:

ALTER TABLE tablename ADD INDEX (location, variable);

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

При попытке оптимизировать запросы команда EXPLAIN весьма полезна: EXPLAIN в документах mysql

Другие вопросы по тегам