Добавление полей для оптимизации запросов 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