Задать вопрос
savostin
@savostin
Еще один программист

Выиграет ли быстродействие от такой оптимизации?

Есть таблица-справочник:
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, ...
для ускорения выборки?
  • Вопрос задан
  • 3277 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Mendel
@Mendel
PHP-developer
В сферическом случае выигрыш будет.
Стоит ли оно того?
Тут ответ кроется в последнем слове вопроса — оптимизация.

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

Еще одно правило плавно вытекает из последнего вопроса — откуда вы узнали что это узкое место? Вы выполняли какие-то тесты? Использовали профилировщик? Ну так любая оптимизация всегда проверяется на практике. Измерьте нагрузку, измените схему, измерьте заново. Эксперимент займет меньше времени чем ждать ответа здесь. И самое главное — ответ на хабре не спасает от того чтобы потом его проверить. Это разумно только в том случае если вы уже убедились что оптимизация вам всё-таки нужна…

ПЫСЫ: не сочтите за грубость. Просто мне так показалось что вы не совсем понимаете о чем спрашиваете. Буду рад ошибиться…
Ответ написан
@WhiteTigera
Нет, такое разбиение выигрыша не принесёт. Вы сначала делаете выбор иtable2 потом по полученному набору id_names делаете выбор из table1, а там выборка происходит по PK — который всегда индексирован и скорость будем мало зависеть от размера таблицы. Так что вынос «не нужных» полей Вам скорости особо не добавит.

Если таблица table2 большая и Вы часто используете условие where type = 2 and some_value > 10 то можно по этим 2-м полям создать индекс и все заработает быстрее.
Ответ написан
Комментировать
playerone
@playerone
В данном случае нет. Если я правильно понял вашу структуру, и вы используете связь «один к одному» то лучше вообще перенести type и some_value в основную таблицу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы