Производительность запросов MySQL с помощью справочных таблиц - PullRequest
0 голосов
/ 05 июня 2018

Для следующих двух структур таблиц предполагается, что объем данных действительно велик:

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, имеет ли смысл индексирование?

1 Ответ

0 голосов
/ 07 июня 2018

По крайней мере, у меня было бы 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) (в любом порядке) возможно и выгодно.

Но ... Если эти два столбца находятся в разных таблицах (как в примере с двумя таблицами), то вы не сможете имеет такой индекс, и производительность пострадает.

...