Я предпочитаю использовать функциональное программирование для сохранения меня повторенная работа путем создания более абстрактной версии и затем использования этого вместо этого. Позвольте мне дать пример. В Java я часто создаю карты записывать структуры, и таким образом писать getOrCreate структуры.
SomeKindOfRecord<T> getOrCreate(T thing) {
if(localMap.contains(t)) { return localMap.get(t); }
SomeKindOfRecord<T> record = new SomeKindOfRecord<T>(t);
localMap = localMap.put(t,record);
return record;
}
Это происходит очень часто. Теперь, на функциональном языке я мог записать
RT<T> getOrCreate(T thing,
Function<RT<T>> thingConstructor,
Map<T,RT<T>> localMap) {
if(localMap.contains(t)) { return localMap.get(t); }
RT<T> record = thingConstructor(t);
localMap = localMap.put(t,record);
return record;
}
, и я никогда не должен буду писать новый из них снова, я мог наследовать его. Но я мог сделать один лучше тогда наследование, я мог сказать в конструкторе этой вещи
getOrCreate = myLib.getOrCreate(*,
SomeKindOfRecord<T>.constructor(<T>),
localMap);
(где * своего рода "отпуск этот параметр открытая" нотация, которая является своего рода приправлением карри)
, и затем локальный getOrCreate является точно тем же, как это было бы, если я выписал все это, в одной строке, без зависимостей от наследования.
I ' m предполагая, что для запросов INSERT ограничения - включая ограничения внешнего ключа - несколько снизят производительность. База данных должна проверить, что все, что вы сказали ей вставить, это то, что позволяют ей вставлять ваши ограничения.
Для запросов SELECT ограничения внешнего ключа не должны вносить никаких изменений в производительность.
Поскольку INSERTS почти всегда очень быстро, небольшое количество дополнительного времени незаметно, за исключением крайних случаев. (Создавая базу данных размером несколько гигабайт, вы можете отключить ограничения, а затем снова включить их позже, если вы уверены, что данные в порядке.)
ограничения внешнего ключа не должны влиять на производительность.Поскольку INSERTS почти всегда выполняются очень быстро, небольшое дополнительное время не будет заметно, за исключением крайних случаев. (Создавая базу данных размером несколько гигабайт, вы можете отключить ограничения, а затем снова включить их позже, если вы уверены, что данные в порядке.)
ограничения внешнего ключа не должны влиять на производительность.Поскольку INSERTS почти всегда выполняются очень быстро, небольшое дополнительное время не будет заметно, за исключением крайних случаев. (Создавая базу данных размером несколько гигабайт, вы можете отключить ограничения, а затем снова включить их позже, если вы уверены, что данные в порядке.)
если внешний ключ необходим для ссылочной целостности, то наличие внешнего ключа должно формировать базовый уровень производительности
. Вы также можете спросить, может ли машина ехать быстрее, если вы этого не сделаете. t положить сиденья - правильно сформированный автомобиль включает сиденья, так же как правильно сформированная база данных включает внешние ключи
Внешние ключи могут вызывать вставки (или некоторые обновления) в дочерние таблицы или удаление из родительских столы, чтобы занять больше времени. Однако это хорошо, поскольку означает, что он обеспечивает сохранность целостности данных. Нет никаких причин отказываться от использования внешних ключей, если только вы этого не сделаете. Не хочу получать полезные данные. Обычно вы не заметите большой разницы, если у вас не будет много внешних ключей, привязанных к одной и той же родительской таблице, или если вы вставляете или удаляете много записей в одном пакете. Кроме того, я заметил, что пользователи более терпимы к нескольким лишним секундам при вставке или удалении, чем при выборе. Пользователи также вообще не терпят ненадежных данных, которые есть у вас без ограничений внешнего ключа.
Вам нужно будет проиндексировать их, чтобы повысить производительность по избранным запросам.
Если внешние ключи оказали какое-либо влияние таким образом, это было бы на INSERTS. База данных выполняет ссылочную проверку внешних ключей при создании / изменении записей, а не при выборе.
Внешние ключи в большинстве случаев не влияют на производительность запросов, поэтому настоятельно рекомендуются. Помогая нормализации, вы устраняете избыточные данные, и если вы последуете добавлением базовых индексов (для соответствующего внешнего ключа), вы получите хорошую производительность по вашим запросам.
Внешние ключи могут помочь оптимизатору запросов получить лучший запрос планы для данного запроса.
Проверка внешнего ключа является фактором, когда вы обновляете свои данные (что является отдельным соображением - я предполагаю, что здесь вас интересует запрос - если под словом запрос вы не подразумеваете и то, и другое).
Я считаю, что в упомянутом сообщении указано, что добавление индекса в поля FK улучшенная производительность, а не просто то, что отношение FK улучшило производительность. Наличие FK в таблице не должно иметь никакого влияния на запрос SELECT, если не выполняются операции JOIN, после чего отношение FK И индекс для полей FK повысит производительность.
Если вы обеспечиваете ссылочную целостность, операции INSERT и UPDATE, влияющие на поле FK, будут выполняться медленнее. Однако обычно не о чем беспокоиться, тем более, что многие БД на 80% читают / 20% пишут. Это также цена, которую стоит заплатить.
Создание индекса по внешнему ключу часто бывает полезным, хотя, очевидно, насколько это зависит от того, какие операторы SELECT вы выполняете.
Как правило, вам нужны внешние ключи из-за нормализации (которая позволяет избежать дублирования данных и проблем с синхронизацией). Нормализуйте до 3-й степени, а затем, проанализировав реальную производительность, вы можете рассмотреть вопрос о денормализации.
Теоретически да: запись данных необходима для проверки ограничений.
На практике редко: если не измерено и не доказано обратное, можно предположить, что это не повлияет на производительность. В подавляющем большинстве случаев проблемы с производительностью возникают из-за других проблем:
При хорошо спроектированной схеме и хороших запросах стоимость ограничений начнет проявляться при очень высокой пропускной способности. Когда это происходит, есть профилактические меры.
Мой 2c: Никогда не жертвуйте ограничениями корректности ради некоторых неуловимых целей производительности. В очень редком случае, когда ограничения действительно являются проблемой, есть измерения, чтобы показать, что ' В этом случае, и как говорится: если вы спросите, сколько это стоит, вы не можете себе этого позволить. Если вам нужно спросить, могут ли ограничения быть проблемой, вы не можете их удалить (без обид).
Согласно Стивенсу Расширенное программирование в среде UNIX глава 13, это процедура для создания хорошо работающего демона Unix:
setsid
для создания нового сеанса.
/
, чтобы не мешать монтированию и размонтированию stdout
, stderr
и stdin
. В настоящее время существует файл для отслеживания PID, который активно используется сценариями загрузки дистрибутива Linux. Внешние ключи имеют секретное дополнительное преимущество, показывая вам, где именно вы, скорее всего, будете выполнять сложные JOIN, и у них есть очень часто используемые поля. Это значительно упрощает работу по индексации, и вы можете практически гарантировать, что все ваши поля FK должны быть проиндексированы. Это делает SELECT намного быстрее.
У внешних ключей есть секретное дополнительное преимущество, заключающееся в том, что они показывают вам, где именно вы, скорее всего, будете выполнять сложные JOIN, и имеют очень часто используемые поля. Это значительно упрощает работу по индексации, и вы можете практически гарантировать, что все ваши поля FK должны быть проиндексированы. Это делает SELECT намного быстрее.