From 51c5bf2961de25c4d08fd9a030add13df35adb2d Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 16 Oct 2024 11:15:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D1=8B=20=D0=91=D0=94.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Индекс для внешнего ключа таблицы БД.md | 18 +++++++++++++----- meta/zero/00 Java разработка.md | 2 -- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/dev/database/Индекс для внешнего ключа таблицы БД.md b/dev/database/Индекс для внешнего ключа таблицы БД.md index 90296f00..f90c2772 100644 --- a/dev/database/Индекс для внешнего ключа таблицы БД.md +++ b/dev/database/Индекс для внешнего ключа таблицы БД.md @@ -7,21 +7,29 @@ zero-link: parents: linked: --- -При создании внешнего ключа в базе данных важно не забывать добавлять индекс на связанный столбец. +При создании внешнего ключа в базе данных важно не забывать про добавление индекса на соответствующий столбец. Разберёмся, почему это важно. -Внешний ключ обеспечивает связь между двумя таблицами, гарантируя, что значения в одном столбце соответствуют значениям в другой таблице. ==При выполнении операций, таких как SELECT, UPDATE или DELETE, СУБД должна проверить целостность данных. Без индекса проверка становится затратной по времени, так как приходится сканировать всю таблицу для поиска нужных записей==. Индекс решает эту проблему, значительно ускоряя поиск и проверку данных. +Сперва обратимся к [документации PostgreSQL](https://www.postgresql.org/docs/current/ddl-constraints.html): -Рассмотрим пример, где мы удаляем строку из таблицы, у которой есть связь с другой таблицей. +> A foreign key must reference columns that either are a primary key or form a unique constraint, or are columns from a non-partial unique index. This means that the referenced columns always have an index to allow efficient lookups on whether a referencing row has a match. Since a `DELETE` of a row from the referenced table or an `UPDATE` of a referenced column will require a scan of the referencing table for rows matching the old value, ==it is often a good idea to index the referencing columns too==. Because this is not always needed, and there are many choices available on how to index, the declaration of a foreign key constraint does not automatically create an index on the referencing columns. + +Когда выполняются операции, такие как SELECT, UPDATE или DELETE, СУБД должна проверять целостность данных. Без индекса проверка связей может занимать много времени, поскольку требуется сканирование всей таблицы для поиска необходимых записей. + +Рассмотрим пример удаления строки из таблицы, связанной с другой таблицей через внешний ключ. ==Удаление выполняется по первичному ключу, и внешний ключ в запросе напрямую не используется.== ![600](../../meta/files/images/Pasted%20image%2020240331093028.png) -Поиск записи в таблице происходит быстро, так как удаление выполняется по первичному ключу. Однако, у нас есть связь с другой таблицей, и ==самый долгий этап это проверка связей с этой таблицей.== +Видно, что поиск по первичному ключу выполняется быстро, так как удаление производится по индексированному первичному ключу. Однако ==наибольшее время занимает проверка связей с другой таблицей.== Добавим индекс на внешний ключ и проведем повторный эксперимент. ![600](../../meta/files/images/Pasted%20image%2020240331093524.png) -Мы получили ускорение в 2055 раз! +После добавления индекса на внешний ключ и повторного выполнения запроса: +- Без индекса на внешний ключ операция удаления заняла 690 мс. +- С индексом — всего 0.101 мс. + +Таким образом, ==в большинстве случаев стоит создавать индекс для внешнего ключа, особенно если часто выполняются операции удаления или обновления==. Но когда индекс не нужен? ==Если в основном таблица используется для операций INSERT и SELECT, индекс на внешний ключ может не понадобиться==. *** ## Мета информация **Область**:: [[../../meta/zero/00 Базы Данных|00 Базы Данных]] diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md index 7d31f386..787a483a 100644 --- a/meta/zero/00 Java разработка.md +++ b/meta/zero/00 Java разработка.md @@ -6,8 +6,6 @@ zero-link: title: Java разработка --- - [Устройство Java](Устройство%20Java.md) - - [JDK](../../dev/java/JDK.md) - - [[../../dev/java/Java Reflection|Java Reflection]] - [[../../dev/java/Многопоточность в Java|Многопоточность в Java]] - Системы сборки - [Maven](00%20Maven.md)