Производительность в этой модели данных? - PullRequest
0 голосов
/ 30 сентября 2009

У меня есть MySQL (innodb) таблица 'items' со следующими характеристиками

  1. Большое количество строк и продолжает увеличиваться.
  2. Большое количество столбцов различных типов данных, включая «текст»;
  3. присутствует первичный ключ 'item_id'.

Существуют дополнительные требования:

  1. Требуется запросить элементы на основе их статуса
  2. Необходимо обновить статус

Вышеуказанные две операции происходят довольно часто.

Учитывая приведенный выше сценарий, у меня есть два вопроса

  1. Может ли создание отдельной таблицы с двумя столбцами, а именно item_id и status с item_id в качестве первичного ключа, повысить производительность?
  2. Если вышеприведенное верно, как я собираюсь решать запросы item_ids на основе статуса?

Я неопытен в работе с базами данных. Я надеюсь, что вы будете терпеть меня :)

Ответы [ 3 ]

3 голосов
/ 30 сентября 2009

Это называется вертикальной сегментацией. Он часто используется, когда объект данных имеет несколько шаблонов доступа, которые обращаются к различным подмножествам атрибутов объектов (столбцы таблицы) с разными частотами. Если одной функции требуется доступ только к одному или двум столбцам 100 раз в секунду, а другой функции приложения нужен доступ ко всем другим столбцам, но только один или два раза в день, то такой подход оправдан и обеспечит существенное улучшение производительности.

По сути, как вы и предлагали, вы "разбиваете" таблицу на две таблицы, обе с одним и тем же ключом, с однозначным отношением FK / PK-> PK. В одну таблицу вы помещаете только те несколько столбцов, к которым осуществляется более частый доступ, а остальные столбцы вы помещаете в другую таблицу, к которой будет осуществляться доступ реже. Затем вы можете применить индексирование к каждой таблице более подходящим образом на основе фактического шаблона доступа для каждой таблицы в отдельности.

1 голос
/ 30 сентября 2009

Было бы разумнее создать индекс для вашего статуса и вашего item_id, если это единственные столбцы, которые вам нужно выбрать.

create index status_item_id_items on items (status)

Затем вы можете запросить свой результат, который будет использовать этот индекс:

select item_id, status from items where status = 'status'

Имейте в виду, что если у вас не так много разных статусов, ваш запрос может закончиться возвращением большого количества строк и может быть медленным. Если вы можете быть ограничены более «селективным» столбцом, таким как datetime, это будет лучше.

0 голосов
/ 30 сентября 2009

Отвечая сначала на часть 2, вы выполните внутреннее объединение двух таблиц:

SELECT i.*, s.StatusCode FROM items AS i INNER JOIN status AS s ON s.item_id = i.item_id

Однако, отвечая на часть 1, я не думаю, что выполнение этого принесет вам какое-либо преимущество в производительности.

...