Я использую однонаправленное наследование (STI) в Rails, упрощенное до следующего:
class Vehicle
belongs_to :user
end
class Car < Vehicle
end
class Plane < Vehicle
end
Каждая запись в таблице vehicles
будет иметь столбец type
, установленный либо в 'Car'
, либо 'Plane'
в дополнение к внешнему ключу user_id
. Он также может иметь дополнительные значения, если добавлено больше типов транспортных средств, однако type
всегда будет иметь гораздо меньшую мощность, чем user_id
. Как и в реальной жизни, я ожидаю, что в этой таблице будет больше автомобилей.
В [:user_id, :type]
(в указанном порядке) есть составной индекс, и эти записи просматриваются подклассами.
Я считаю, что в худшем случае без Planes индекс будет использоваться, так как user_id
является первым, а вторая часть по существу будет проигнорирована. В этом случае один индекс будет иметь очень малое преимущество, поскольку он не поддерживает составной второй столбец.
Что происходит в случае, когда существует равное разделение?
user_id
), превышать или отрицать любую экономию?Пример вызова ActiveRecord будет Car.where(user_id: 10)
, который генерирует следующий SQL:
SELECT `vehicles`.* FROM `vehicles` WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
Стоимость поддержания индекса (одностолбцовый или многостолбцовый) почти всегда перевешивается улучшением производительности при использовании этого индекса. Это небольшое приращение для каждого INSERT
/DELETE
плюс стоимость, если изменить значение индексированного поля через UPDATE
. (Случай UPDATE
редок.) Итак, не беспокойтесь о стоимости "поддержания составного индекса".
WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
требуется INDEX(user_id, type)
.
Оптимизатор будет
Включить индекс; не беспокойтесь об этом.
Я упорядочил поля таким образом, а не (type, user_id)
на основе вашего IN
, что означает, что иногда вы можете иметь несколько значений для type
.
Если все строки в таблице имеют type = 'Car'
, никаких проблем. Все, что я сказал, все равно применяется. Отходы включения ненужного type
несущественны.
Лучше иметь все столбцы "=" сначала в индексе, то не более одного другого поля. Дальнейшее обсуждение здесь.