По крайней мере, у меня было бы INDEX(owner_name)
, поскольку это очень избирательно.Наличие INDEX(owner_name, model_year)
не поможет достаточно, чтобы иметь значение для данных такого типа .В других случаях я бы рекомендовал составной индекс из 4 столбцов.
«объем данных действительно велик».Если вы говорите, что есть 100К строк, то это не имеет большого значения.Если вы говорите миллиард строк, то нам нужно вдаваться в подробности.
"объем данных действительно велик".10 запросов в секунду - зевок.1000 в секунду - подробности, пожалуйста.
2 таблицы против 1.
- Целостность данных - кто-то может испортить данные в любом случае
- Скорость -1-байтовый
TINYINT UNSIGNED
(диапазон 0..255) меньше, чем в среднем около 7 байтов для VARCHAR(55) for
brand . 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
.
Еще одно толкование того, что вы сказали (плюс небольшое прочтение между строк): можно ли искать по какой-либо комбинации столбцов?Возможно, не =
такие вещи, как year >= 2016
?Или make IN ('Toyota', 'Nissan')
?
Study http://mysql.rjweb.org/doc.php/index_cookbook_mysql
Аргумент для 1 таблицы
Если вам нужно сделать
WHERE brand = 'Toyota'
AND year = 2017
Тогда INDEX(brand, year)
(в любом порядке) возможно и выгодно.
Но ... Если эти два столбца находятся в разных таблицах (как в примере с двумя таблицами), то вы не сможете имеет такой индекс, и производительность пострадает.