Есть таблица-справочник: id (PK), type, some_value, name_russian, name_english, name_italian, name_greek, ...
данные почти никогда меняться не будут.
Есть таблица данных: id (PK), id_names, other_field
где id_names — id первой таблицы.
Очень часто надо выбирать inner join из этих двух таблиц, но только type и some_value.
Есть ли смысл разбить первую таблицу на две: id (PK), type, some_value id (PK), name_russian, name_english, name_italian, name_greek, ...
для ускорения выборки?
В сферическом случае выигрыш будет.
Стоит ли оно того?
Тут ответ кроется в последнем слове вопроса — оптимизация.
Одно из правил оптимизации гласит — не нужно оптимизировать то, что не нужно оптимизировать.
Ну или «преждевременная оптимизация — зло».
Вы испытываете проблемы с производительностью? Эти проблемы связаны с базой данных? Именно с этими запросами?
Откуда Вы об этом узнали?
Если вы не можете положительно ответить на эти вопросы, то оптимизация преждевременная, т.е. сам процесс оптимизации и сложности с ним связанные будут хуже чем выигрыш от оптимизации когда она еще не нужна.
Еще одно правило плавно вытекает из последнего вопроса — откуда вы узнали что это узкое место? Вы выполняли какие-то тесты? Использовали профилировщик? Ну так любая оптимизация всегда проверяется на практике. Измерьте нагрузку, измените схему, измерьте заново. Эксперимент займет меньше времени чем ждать ответа здесь. И самое главное — ответ на хабре не спасает от того чтобы потом его проверить. Это разумно только в том случае если вы уже убедились что оптимизация вам всё-таки нужна…
ПЫСЫ: не сочтите за грубость. Просто мне так показалось что вы не совсем понимаете о чем спрашиваете. Буду рад ошибиться…
Нет, такое разбиение выигрыша не принесёт. Вы сначала делаете выбор иtable2 потом по полученному набору id_names делаете выбор из table1, а там выборка происходит по PK — который всегда индексирован и скорость будем мало зависеть от размера таблицы. Так что вынос «не нужных» полей Вам скорости особо не добавит.
Если таблица table2 большая и Вы часто используете условие where type = 2 and some_value > 10 то можно по этим 2-м полям создать индекс и все заработает быстрее.
В данном случае нет. Если я правильно понял вашу структуру, и вы используете связь «один к одному» то лучше вообще перенести type и some_value в основную таблицу.
Нет, такое разбиение выигрыша не принесёт. В любом случае при join БД будет выбирать (должна) из таблицы справочника по PK, а этот запрос пойдёт по индексу. Но лучше посмотреть на Ваш запрос, может его можно оптимизировать сократив обращения к таблице данных. Можете показать полностью?
Вот статья на похожую тему, как посмотреть на план выполнения запроса: habrahabr.ru/post/31129/
select table2.id, other_field from table2 inner join table1 on id_names = table1.id where type = 2 and some_value > 10;
Т.е. в запросах никодга не участвуют поля name_*, но это varchar'ы и их достаточно много, т.е. без них таблица намного меньше «занимает».
В общем случае вопрос звучит так: стоит ли выносить в другую таблицу тяжелые данные, которые никогда не участвуют в запросах?