2009-09-30 1 views
0

У меня есть MySQL (InnoDB) таблицы «элементы» со следующими характеристикамиПреимущества в этой модели данных?

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

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

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

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

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

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

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

ответ

3

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

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

+0

Спасибо за ответ. – nano

1

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

create index status_item_id_items on items (status) 

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

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

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

+0

Спасибо Винсент. Но если я индексирую как item_id, так и статус, не будет ли обновление значений статуса медленнее по мере увеличения размера таблицы? Или это не имеет большого значения, поскольку в нем есть только две колонки? – nano

+0

Для обновления одной строки за раз, которая, вероятно, является вашим прецедентом, она должна быть незначительной. Это правда, что у вас есть еще один индекс для обновления, но создание новой таблицы будет стоить намного дороже. – Vincent

+0

Спасибо. Очень ценю вашу помощь. – nano

0

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

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

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