Объединить таблицы с отношениями один-к-одному - PullRequest
0 голосов
/ 15 июля 2011

У меня есть четыре таблицы, в которых хранится много информации о чем-то.Эта информация может быть разделена на четыре категории.Одна категория информации запрашивается всегда, а остальные три - иногда.

Поскольку между всеми этими таблицами существует взаимно-однозначное отношение, они могут храниться в одной таблице.

Мой вопрос: что было бы лучше с точки зрения производительности?

  • Одна таблица с запросами типа SELECT id, x, y, z FROM all и SELECT id, u, v FROM all

  • Несколько таблиц с запросами типа SELECT * FROM xyz и SELECT * FROM uv

(где id, u, v, x, y и z - это столбцы, а all - это таблица со всеми столбцами и xyz и uv - таблицы с соответствующими столбцами)

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Это действительно зависит.

Теоретически реляционные базы данных были созданы для эффективного взаимодействия между таблицами .Так что SELECT a.x, a.y, a.z FROM a должно быть так же быстро, как и SELECT a.x, a.y, b.z from a JOIN b ON a.x = b.x, если ax и bx оба являются одним и тем же первичным ключом (eq_ref join).

Примеры:

  • Выбор нескольких последовательныхСтроки из одной большой таблицы будут немного быстрее, чем из двух небольших таблиц, благодаря физическому расположению записей на диске.

  • Если разные таблицы не находятся на разных жестких дисках, в этом случае MySQL может извлекать их параллельно.

  • Но это также может бытьсделано с одной таблицей, используя PARTITIONING.

  • Если некоторые запросы выполняются чаще, чем другие, вы можете сначала оптимизировать их.Может, индекс покрытия решает вашу проблему?

  • Использование нескольких таблиц также повторяет первичный ключ.Но опять же, как и индексы для InnoDB.

  • С несколькими таблицами сложнее поддерживать целостность.Вы будете использовать FOREIGN KEYS и транзакции для своих вставок (или даже триггеров?)

Вывод:

это действительно зависит от вашей ситуации.Лучший способ выяснить это - проверить и протестировать.

0 голосов
/ 15 июля 2011

Зависит от многих факторов.

Обычно никто не будет делать SELECT * FROM xyz и SELECT * FROM uv, когда вы можете так же легко сделать SELECT * FROM xyz INNER JOIN uv ON xyz.id = uv.id при наличии отношения 1-1.Даже если отношение является необязательным, вы можете использовать LEFT JOIN так же эффективно.

Обычно никто не будет делать SELECT *, а вместо этого будет выбирать только столбцы в зависимости от необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...