--- aliases: tags: - maturity/🌱 date: 2024-10-11 zero-link: parents: linked: --- ΠŸΡ€ΠΈ создании внСшнСго ΠΊΠ»ΡŽΡ‡Π° Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π°ΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ индСкса Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ столбСц. РазбСрёмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ. Π‘ΠΏΠ΅Ρ€Π²Π° обратимся ΠΊ [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ 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. Когда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ INSERT, UPDATE ΠΈΠ»ΠΈ DELETE, Π‘Π£Π‘Π” Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π΅Π· индСкса ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° связСй ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ трСбуСтся сканированиС всСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ для поиска Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… записСй. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ удалСния строки ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, связанной с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· внСшний ΠΊΠ»ΡŽΡ‡. ==Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ выполняСтся ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΈ внСшний ΠΊΠ»ΡŽΡ‡ Π² запросС Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.== ![600](../../meta/files/images/Pasted%20image%2020240331093028.png) Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ поиск ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ выполняСтся быстро, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ производится ΠΏΠΎ индСксированному ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ. Однако ==наибольшСС врСмя Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° связСй с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ.== Π”ΠΎΠ±Π°Π²ΠΈΠΌ индСкс Π½Π° внСшний ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ экспСримСнт. ![600](../../meta/files/images/Pasted%20image%2020240331093524.png) ПослС добавлСния индСкса Π½Π° внСшний ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ выполнСния запроса: - Π‘Π΅Π· индСкса Π½Π° внСшний ΠΊΠ»ΡŽΡ‡ опСрация удалСния заняла 690 мс. - Π‘ индСксом β€” всСго 0.101 мс. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ==Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв стоит ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ индСкс для внСшнСго ΠΊΠ»ΡŽΡ‡Π°, особСнно Ссли часто Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ удалСния ΠΈΠ»ΠΈ обновлСния==. Но ΠΊΠΎΠ³Π΄Π° индСкс Π½Π΅ Π½ΡƒΠΆΠ΅Π½? ==Если Π² основном Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ INSERT ΠΈ SELECT, индСкс Π½Π° внСшний ΠΊΠ»ΡŽΡ‡ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ==. *** ## ΠœΠ΅Ρ‚Π° информация **ΠžΠ±Π»Π°ΡΡ‚ΡŒ**:: [[../../meta/zero/00 Π‘Π°Π·Ρ‹ Π”Π°Π½Π½Ρ‹Ρ…|00 Π‘Π°Π·Ρ‹ Π”Π°Π½Π½Ρ‹Ρ…]] **Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ**:: [[ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ SQL запросов]] **Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ**:: **Π‘ΠΎΠ·Π΄Π°Π½Π°**:: [[2024-10-11]] **Автор**:: ### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - ### Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ