Производительность запросов MySQL с помощью справочных таблиц

0

Для следующих 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, имеет ли смысл индексировать какие-либо?

  • 0
    В любом случае новая таблица имеет преимущество в целостности данных. Производительность вам придется измерить. Это может или не может зависеть от ваших запросов. То же самое для индексации. Зависит от того, что вы делаете. Может быть 4 индекса, может быть один.
  • 0
    Составной индекс по всем 4 столбцам (и в таком порядке) может быть полезен, но имейте в виду, что запрос, который не использует первые столбцы индекса, не может использовать последующие столбцы индекса.
Показать ещё 3 комментария
Теги:
query-performance

1 ответ

0
Лучший ответ

У меня был бы хотя бы INDEX(owner_name) поскольку он очень избирательный. Наличие INDEX(owner_name, model_year) не поможет сделать достаточно для этого типа данных. Существуют и другие случаи, когда я бы рекомендовал составной индекс из 4 столбцов.

"объем данных действительно высок". Если вы говорите, что есть 100K строк, то это не имеет большого значения. Если вы говорите миллиард строк, то нам нужно получить намного больше деталей.

"объем данных действительно высок". 10 запросов/секунд - Yawn. 1000/секунд - подробнее, пожалуйста.

2 таблицы против 1.

  • Целостность данных - кто-то может испортить данные в любом случае
  • Скорость - 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) (в любом порядке) возможен и выгоден.

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

  • 0
    Спасибо Рик Джеймс, приятно сказал. Просто для повторения, если я скажу все в одной таблице, будет "brand_name", которая является строкой. Если 2 таблицы, то "brand_id" + объединение. Производительность мудрая, 2 таблицы против 1 в этом случае? мои записи превышают 3 миллиона и растут.
  • 0
    1 стол. Смотрите мои дополнения.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню