Для следующих 2 табличных структур, если объем данных действительно высок:
cars table
Id | brand name | make year | purchase year | owner name
Есть ли какое-либо преимущество в производительности запросов при структурировании его таким образом и вместо этого вместо двух таблиц?
cars table
Id | brand_id | make year | purchase year | owner name
brands table
Id | name
Кроме того, если все 4 столбца попадают в мое предложение where, имеет ли смысл индексировать какие-либо?
У меня был бы хотя бы INDEX(owner_name)
поскольку он очень избирательный. Наличие INDEX(owner_name, model_year)
не поможет сделать достаточно для этого типа данных. Существуют и другие случаи, когда я бы рекомендовал составной индекс из 4 столбцов.
"объем данных действительно высок". Если вы говорите, что есть 100K строк, то это не имеет большого значения. Если вы говорите миллиард строк, то нам нужно получить намного больше деталей.
"объем данных действительно высок". 10 запросов/секунд - Yawn. 1000/секунд - подробнее, пожалуйста.
2 таблицы против 1.
TINYINT UNSIGNED
(диапазон 0,255) меньше, чем в среднем около 7 байт для VARCHAR(55) for
бренда . But it is hardly enough smaller to matter on space or speed. (And if you goof and make
. But it is hardly enough smaller to matter on space or speed. (And if you goof and make
. But it is hardly enough smaller to matter on space or speed. (And if you goof and make
Brand_ID a
BIGINT", который 8 байт;! Ну упс)Индексирование всех столбцов отличается от индексов. Но "индексирование всего" неоднозначно:
INDEX(user), INDEX(brand), INDEX(year),...
, вероятно, будут эффективны для поиска или сортировки по любому из этих столбцов.INDEX(user, brand, year),...
делает особенно эффективным поиск по всем этим столбцам (с =
) или определенным ORDER BYs
.SELECT
. Другая интерпретация того, что вы сказали (плюс небольшое чтение между строками): Можете ли вы искать любую комбинацию столбцов? Возможно, non- =
такие вещи, как year >= 2016
? Или make IN ('Toyota', 'Nissan')
?
Исследование http://mysql.rjweb.org/doc.php/index_cookbook_mysql
Аргумент для 1 таблицы
Если вам нужно сделать
WHERE brand = 'Toyota'
AND year = 2017
Тогда INDEX(brand, year)
(в любом порядке) возможен и выгоден.
Но... Если эти два столбца находятся в разных таблицах (как и в примере с двумя таблицами), тогда у вас не может быть такого индекса, и производительность будет страдать.