Π’ΡΡΡΡΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² ΠΈΠ· ΠΎΡΠΈΡΠΎΠ² ΠΏΡΠΎΠ΄Π°ΠΆ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΡΡΡΠ°Π½Π΅ ΡΠΈΠΊΡΠΈΡΡΡΡ Π²
ΠΠΎΡΡΠΎΠΌΡ Π½Π΅ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ, ΡΠ°Π·Π±ΠΈΡΠ°Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π· Β«ΡΡΠΆΠ΅Π»ΡΠ΅Β» Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡΡ
Π½Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ
Π±Π°Π· β Π½Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ
ΠΡΠΈΡΠ΅ΠΌ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΡΠ°ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΡΠ²ΠΈΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ Π΄Π΅Π³ΡΠ°Π΄Π°ΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π΅Π³ΠΎ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΈΠ»Π°ΠΌΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π»Π° ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ· Π»ΡΡΡΠΈΡ ΠΏΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΠΉ.
0: ΡΠ΅Π³ΠΎ ΠΆΠ΅ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
[ΠΠΠΠ
Π§ΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΠ³Π΄Π° Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΏΡΠΎ Β«Π±ΡΡΡΡΡΠΉΒ» ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ? ΠΠΎΡΡΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΡΡΠΎ Π½Π΅ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Β«ΡΠ΅ΡΡΠ½ΡΠΉΒ» ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ΅ ΡΠΈΠΏΠ° ... LIKE '%ΡΠΎΠ·Π°%'
β Π²Π΅Π΄Ρ ΡΠΎΠ³Π΄Π° Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ 'Π ΠΎΠ·Π°Π»ΠΈΡ'
ΠΈ 'ΠΠ°Π³Π°Π·ΠΈΠ½ Π ΠΎΠ·Π°'
, Π½ΠΎ ΠΈ 'ΠΡΠΎΠ·Π°'
ΠΈ Π΄Π°ΠΆΠ΅ 'ΠΠΎΠΌ ΠΠ΅Π΄Π° ΠΠΎΡΠΎΠ·Π°'
.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΆΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ Π½Π° Π±ΡΡΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, ΡΡΠΎ Π²Ρ Π΅ΠΌΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΠ΅ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ Π½Π°ΡΠ°Π»Ρ ΡΠ»ΠΎΠ²Π° Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΡΠΌ ΡΠΎ, ΡΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π½Π° Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅. Π ΡΠ΄Π΅Π»Π°Π΅ΡΠ΅ ΡΡΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ β ΠΏΡΠΈ ΠΏΠΎΠ΄ΡΡΡΠΎΡΠ½ΠΎΠΌ Π²Π²ΠΎΠ΄Π΅.
1: ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ
Π ΡΠΆ ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡΡ 'ΡΠΎΠ· ΠΌΠ°Π³Π°Π·'
, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Π²Π°ΠΌ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΈΡΠΊΠ°ΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΠΎ. ΠΠ΅Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° Π±ΡΡΡΡΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ»ΠΎΠ²Π° Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ ΡΠ΅Π»Π΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎ Β«Π½Π΅Π΄ΠΎΠ²Π²ΠΎΠ΄ΠΈΡΡΒ» ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ β ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΠΈΠΊ.
ΠΠΎΠΎΠ±ΡΠ΅, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π·Π°Π΄Π°ΡΠ΅ β Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ½ΠΎΠ³Π΄Π° Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· use case
Π§ΡΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ?
1.0: Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ
ΠΠΉ, ΠΏΠΎΠΈΡΠΊ ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, ΡΡΠΎ-ΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΠΌ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ Π½Π΅ Ρ ΠΎΡΠ΅ΡΡΡ β Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΎΡΠ΄Π°Π΄ΠΈΠΌ ΡΡΠΎ devops! ΠΡΡΡΡ ΠΎΠ½ΠΈ Π½Π°ΠΌ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΠ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ: Sphinx, ElasticSearch,β¦
Π Π°Π±ΠΎΡΠΈΠΉ, Ρ
ΠΎΡΡ ΠΈ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΉ Π² ΠΏΠ»Π°Π½Π΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ. ΠΠΎ Π½Π΅ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠΈΡΠΊ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ
Π΄Π°Π½Π½ΡΡ
Π΅Π³ΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°. Π Π΄Π°Π½Π½ΡΠ΅ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΡΠΎΠΊΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠΈΠ²ΠΎΡΡΡ β ΠΈ Π΅ΡΠ»ΠΈ ΡΠ΅ΠΉΡΠ°Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π²Π½Π΅Ρ ΠΊΠ°ΡΡΠΎΡΠΊΡ 'ΠΠ°Π³Π°Π·ΠΈΠ½ Π ΠΎΠ·Π°'
, ΡΠΎ ΡΠ΅ΡΠ΅Π· 5-10 ΡΠ΅ΠΊΡΠ½Π΄ ΠΎΠ½ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ Π·Π°Π±ΡΠ» ΡΠΊΠ°Π·Π°ΡΡ ΡΠ°ΠΌ email ΠΈ Π·Π°Ρ
ΠΎΡΠ΅ΡΡ Π΅Π΅ Π½Π°ΠΉΡΠΈ ΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ.
ΠΠΎΡΡΠΎΠΌΡ β Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΊΠ°ΡΡ Β«ΠΏΡΡΠΌΠΎ ΠΏΠΎ Π±Π°Π·Π΅Β». Π ΡΡΠ°ΡΡΡΡ, PostgreSQL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, ΠΈ Π½Π΅ ΠΎΠ΄Π½ΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ β ΠΈΡ ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ.
1.1: Β«ΡΠ΅ΡΡΠ½Π°ΡΒ» ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°
Π¦Π΅ΠΏΠ»ΡΠ΅ΠΌΡΡ Π·Π° ΡΠ»ΠΎΠ²ΠΎ Β«ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°Β». Π Π²Π΅Π΄Ρ ΡΠΎΠ²Π½ΠΎ Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ΅ (ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌ!) Π΅ΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π²Π·ΡΡΡ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ°ΠΊΡΡ ΡΠ°Π±Π»ΠΈΡΠΊΡ:
CREATE TABLE firms(
id
serial
PRIMARY KEY
, name
text
);
ΠΠ°Π»ΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΄Π° 7.8 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΉ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΡΠ΅ΠΌ:
CREATE EXTENSION pg_trgm;
CREATE INDEX ON firms USING gin(lower(name) gin_trgm_ops);
ΠΠΎΠΈΡΠ΅ΠΌ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠ΅ΡΠ²ΡΠ΅ 10 Π·Π°ΠΏΠΈΡΠ΅ΠΉ:
SELECT
*
FROM
firms
WHERE
lower(name) ~ ('(^|s)' || 'ΡΠΎΠ·Π°')
ORDER BY
lower(name) ~ ('^' || 'ΡΠΎΠ·Π°') DESC -- ΡΠ½Π°ΡΠ°Π»Π° "Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠ΅ΡΡ Π½Π°"
, lower(name) -- ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎ Π°Π»ΡΠ°Π²ΠΈΡΡ
LIMIT 10;
ΠΡ, ΡΠ°ΠΊΠΎΠ΅β¦ 26ΠΌΡ, 31MB ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ Π±ΠΎΠ»ΡΡΠ΅ 1.7K ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ β Π΄Π»Ρ 10 ΠΈΡΠΊΠΎΠΌΡΡ . ΠΠ°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π»ΠΈΠΊΠΈ, Π½Π΅Π»ΡΠ·Ρ Π»ΠΈ ΠΊΠ°ΠΊ-ΡΠΎ ΠΏΠΎΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅?
1.2: ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ? ΡΡΠΎ ΠΆΠ΅ FTS!
ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, PostgreSQL ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΡΠ΅Π½Ρ ΠΌΠΎΡΠ½ΡΠΉ
CREATE INDEX ON firms USING gin(to_tsvector('simple'::regconfig, lower(name)));
SELECT
*
FROM
firms
WHERE
to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ΡΠΎΠ·Π°:*')
ORDER BY
lower(name) ~ ('^' || 'ΡΠΎΠ·Π°') DESC
, lower(name)
LIMIT 10;
Π’ΡΡ Π½Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΎΠ³Π»Π° ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, ΡΠΎΠΊΡΠ°ΡΠΈΠ² Π²ΡΠ΅ΠΌΡ Π²Π΄Π²ΠΎΠ΅ Π΄ΠΎ 11ΠΌΡ. ΠΠ° ΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π² 1.5 ΡΠ°Π·Π° ΠΌΠ΅Π½ΡΡΠ΅ β Π²ΡΠ΅Π³ΠΎ 20MB. Π ΡΡΡ ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ β ΡΠ΅ΠΌ Π»ΡΡΡΠ΅, Π²Π΅Π΄Ρ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΌΡ Π²ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ, ΡΠ΅ΠΌ Π²ΡΡΠ΅ ΡΠ°Π½ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ cache miss, ΠΈ ΠΊΠ°ΠΆΠ΄Π°Ρ Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½Π°Ρ Ρ Π΄ΠΈΡΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π΄Π°Π½Π½ΡΡ β ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Β«ΡΠΎΡΠΌΠΎΠ·Π°Β» Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ°.
1.3: Π²ΡΠ΅-ΡΠ°ΠΊΠΈ LIKE?
ΠΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ Ρ ΠΎΡΠΎΡ, Π΄Π° ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π΄Π΅ΡΠ½ΡΡΡ ΡΠΎΡΠ½Ρ ΡΡΡΡΡ ΡΠ°Π· Π·Π° ΡΡΡΠΊΠΈ, ΡΠΎ Π½Π°Π±Π΅ΠΆΠΈΡ ΡΠΆΠ΅ 2TB ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ . Π Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ, Π½ΠΎ Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π΅Ρ, ΡΠΎ ΠΈ Ρ Π΄ΠΈΡΠΊΠ°. Π’Π°ΠΊ ΡΡΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΠ΅.
ΠΡΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ
ΠΎΡΠ΅Ρ Π²ΠΈΠ΄Π΅ΡΡ ΡΠ½Π°ΡΠ°Π»Π° Β«ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Π½Π° …Β». Π’Π°ΠΊ Π²Π΅Π΄Ρ ΡΡΠΎ ΠΆΠ΅ Π² ΡΠΈΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅ text_pattern_ops
! Π ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Β«Π½Π΅ Ρ
Π²Π°ΡΠΈΡΒ» Π΄ΠΎ 10 ΠΈΡΠΊΠΎΠΌΡΡ
Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΡΠΎ Π΄ΠΎΡΠΈΡΡΠ²Π°ΡΡ ΠΈΡ
ΠΏΡΠΈΠ΄Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ FTS-ΠΏΠΎΠΈΡΠΊΠ°:
CREATE INDEX ON firms(lower(name) text_pattern_ops);
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ΡΠΎΠ·Π°' || '%')
LIMIT 10;
ΠΡΠ»ΠΈΡΠ½ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ β Π²ΡΠ΅Π³ΠΎ 0.05ΠΌΡ ΠΈ ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ 100KB ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ! Π’ΠΎΠ»ΡΠΊΠΎ ΠΌΡ ΠΆΠ΅ Π·Π°Π±ΡΠ»ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ Π·Π°Π±Π»ΡΠ΄ΠΈΠ»ΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ :
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ΡΠΎΠ·Π°' || '%')
ORDER BY
lower(name)
LIMIT 10;
ΠΠΉ, ΡΡΠΎ-ΡΠΎ ΡΠΆΠ΅ Π½Π΅ ΡΠ°ΠΊ ΠΊΡΠ°ΡΠΈΠ²ΠΎ β Π²ΡΠΎΠ΄Π΅ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ Π΅ΡΡΡ, Π½ΠΎ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π»Π΅ΡΠΈΡ ΠΌΠΈΠΌΠΎ Π½Π΅Π³ΠΎβ¦ ΠΠ½ΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠΆΠ΅ Π² ΡΠ°Π·Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅, ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π½ΠΎβ¦
1.4: Β«Π΄ΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°ΠΏΠΈΠ»ΡΠ½ΠΈΠΊΠΎΠΌΒ»
ΠΠΎ Π΅ΡΡΡ ΠΆΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ ΠΈΡΠΊΠ°ΡΡ, ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ β ΠΎΠ±ΡΡΠ½ΡΠΉ btree!
CREATE INDEX ON firms(lower(name));
Π’ΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠ΄ Π½Π΅Π³ΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Β«ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π²ΡΡΡΠ½ΡΡΒ»:
SELECT
*
FROM
firms
WHERE
lower(name) >= 'ΡΠΎΠ·Π°' AND
lower(name) <= ('ΡΠΎΠ·Π°' || chr(65535)) -- Π΄Π»Ρ UTF8, Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡΠΎΠ²ΡΡ
- chr(255)
ORDER BY
lower(name)
LIMIT 10;
ΠΡΠ»ΠΈΡΠ½ΠΎ β ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΈ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΎΡΡΠ°Π»ΠΎΡΡ Β«ΠΌΠΈΠΊΡΠΎΡΠΊΠΎΠΏΠΈΡΠ΅ΡΠΊΠΈΠΌΒ», Π² ΡΡΡΡΡΠΈ ΡΠ°Π· ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅ Β«ΡΠΈΡΡΠΎΠ³ΠΎΒ» FTS! ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ±ΡΠ°ΡΡ Π² Π΅Π΄ΠΈΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ:
(
SELECT
*
FROM
firms
WHERE
lower(name) >= 'ΡΠΎΠ·Π°' AND
lower(name) <= ('ΡΠΎΠ·Π°' || chr(65535)) -- Π΄Π»Ρ UTF8, Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡΠΎΠ²ΡΡ
ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΠΊ - chr(255)
ORDER BY
lower(name)
LIMIT 10
)
UNION ALL
(
SELECT
*
FROM
firms
WHERE
to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ΡΠΎΠ·Π°:*') AND
lower(name) NOT LIKE ('ΡΠΎΠ·Π°' || '%') -- "Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠ΅ΡΡ Π½Π°" ΠΌΡ ΡΠΆΠ΅ Π½Π°ΡΠ»ΠΈ Π²ΡΡΠ΅
ORDER BY
lower(name) ~ ('^' || 'ΡΠΎΠ·Π°') DESC -- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡ ΠΆΠ΅ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ, ΡΡΠΎΠ±Ρ ΠΠ ΠΏΠΎΠΉΡΠΈ ΠΏΠΎ btree-ΠΈΠ½Π΄Π΅ΠΊΡΡ
, lower(name)
LIMIT 10
)
LIMIT 10;
ΠΠ°ΠΌΠ΅ΡΡ, ΡΡΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π΅ΡΠ½ΡΠ» ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ LIMIT
ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΡΡΠΎΠΊ. ΠΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ
Π’Π°ΠΊΠΈ Π΄Π°, ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠΌΠ΅Π΅ΠΌ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ btree ΠΈ gin, Π·Π°ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΠΌΠ΅Π½ΡΡΠ΅ 10% Π·Π°ΠΏΡΠΎΡΠΎΠ² Π΄ΠΎΡ ΠΎΠ΄ΡΡ Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Π’ΠΎ Π΅ΡΡΡ ΠΏΡΠΈ ΡΠ°ΠΊΠΈΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΠΈΠΏΠΈΡΠ½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ Π΄Π»Ρ Π·Π°Π΄Π°ΡΠΈ ΠΌΡ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠ΅ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π² ΡΡΡΡΡΠΈ ΡΠ°Π·!
1.5*: ΠΎΠ±ΠΎΠΉΠ΄Π΅ΠΌΡΡ Π±Π΅Π· Π½Π°ΠΏΠΈΠ»ΡΠ½ΠΈΠΊΠ°
ΠΡΡΠ΅ LIKE
Π½Π°ΠΌ ΠΏΠΎΠΌΠ΅ΡΠ°Π»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°. ΠΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Β«Π½Π°ΡΡΠ°Π²ΠΈΡΡ Π½Π° ΠΏΡΡΡ ΠΈΡΡΠΈΠ½Π½ΡΠΉΒ» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΈΡ USING-ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°:
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΡΡΡ
ASC
. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΠΈΠΌΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈUSING
. ΠΠΏΠ΅ΡΠ°ΡΠΎΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ»Π΅Π½ΠΎΠΌ Β«ΠΌΠ΅Π½ΡΡΠ΅Β» ΠΈΠ»ΠΈ Β«Π±ΠΎΠ»ΡΡΠ΅Β» Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² B-Π΄Π΅ΡΠ΅Π²Π°.ASC
ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎUSING <
ΠΈDESC
ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎUSING >
.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Β«ΠΌΠ΅Π½ΡΡΠ΅Β» β ΡΡΠΎ ~<~
:
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ΡΠΎΠ·Π°' || '%')
ORDER BY
lower(name) USING ~<~
LIMIT 10;
2: ΠΊΠ°ΠΊ Β«ΠΏΡΠΎΠΊΠΈΡΠ°ΡΡΒ» Π·Π°ΠΏΡΠΎΡΡ
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π½Π°Ρ Π·Π°ΠΏΡΠΎΡ Β«Π½Π°ΡΡΠΎΡΡΡΡΡΒ» ΠΏΠΎΠ»Π³ΠΎΠ΄Π°-Π³ΠΎΠ΄, ΠΈ Ρ ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ½ΠΎΠ²Π° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Β«Π² ΡΠΎΠΏΠ΅Β» Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Β«ΠΏΡΠΎΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡΒ» ΠΏΠ°ΠΌΡΡΠΈ (buffers shared hit) Π² 5.5TB β ΡΠΎ Π΅ΡΡΡ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π±ΡΠ»ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎ.
ΠΠ΅Ρ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΈ Π±ΠΈΠ·Π½Π΅Ρ Ρ Π½Π°Ρ Π²ΡΡΠΎΡ, ΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ»Π°ΡΡ, Π½ΠΎ Π½Π΅ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅! ΠΠ½Π°ΡΠΈΡ, ΡΡΠΎ-ΡΠΎ ΡΡΡ Π½Π΅ΡΠΈΡΡΠΎ β Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ.
2.1: ΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³Π°
Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π·Π°Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ· Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° Β«ΠΏΡΡΠ³Π½ΡΡΡΒ» Π² ΡΠ΅Π΅ΡΡΡ Ρ ΡΠ΅ΠΌΠΈ ΠΆΠ΅, Π½ΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ. Π ΠΊΠ°ΠΊΠΎΠΉ ΡΠ΅Π΅ΡΡΡ Π±Π΅Π· ΠΏΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠΉ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ? ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΈΠΊΡΡΡΠΈΠΌ!
( ... LIMIT <N> + 10)
UNION ALL
( ... LIMIT <N> + 10)
LIMIT 10 OFFSET <N>;
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Π΅Π· Π½Π°ΠΏΡΡΠ³ΠΎΠ² Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ΅Π΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ° Ρ Β«ΡΠΈΠΏΠ°-ΠΏΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠΉΒ» ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠΎΠΉ.
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π° ΡΠ°ΠΌΠΎΠΌ-ΡΠΎ Π΄Π΅Π»Π΅, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΡ ΡΠΈΡΠ°Π΅ΡΡΡ Π²ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π±ΠΎΠ»ΡΡΠ΅ (Π²ΡΠ΅ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ°Π·Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ±ΡΠΎΡΠΈΠΌ, ΠΏΠ»ΡΡ Π½ΡΠΆΠ½ΡΠΉ Β«Ρ Π²ΠΎΡΡΠΈΠΊΒ») β ΡΠΎ Π΅ΡΡΡ ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΡΠΉ Π°Π½ΡΠΈΠΏΠ°ΡΡΠ΅ΡΠ½. Π ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π΅Π΅ Π±ΡΠ»ΠΎ Π±Ρ β Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΠΎΠΈΡΠΊ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΊΠ»ΡΡΠ°, Π½ΠΎ ΠΏΡΠΎ ΡΡΠΎ β Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°Π·.
2.2: Ρ ΠΎΡΠ΅ΡΡΡ ΡΠΊΠ·ΠΎΡΠΈΠΊΠΈ
Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π·Π°Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΡΡ Π²ΡΠ±ΠΎΡΠΊΡ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π²Π΅ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ Π±ΡΠ» ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π² CTE:
WITH q AS (
...
LIMIT <N> + 10
)
SELECT
*
, (SELECT ...) sub_query -- ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π·Π°ΠΏΡΠΎΡ ΠΊ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅
FROM
q
LIMIT 10 OFFSET <N>;
Π Π΄Π°ΠΆΠ΅ ΡΠ°ΠΊ β Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ 10 Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅β¦
2.3: DISTINCT Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΠΉ ΠΈ Π±Π΅ΡΠΏΠΎΡΠ°Π΄Π½ΡΠΉ
ΠΠ΄Π΅-ΡΠΎ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°ΠΊΠΎΠΉ ΡΠ²ΠΎΠ»ΡΡΠΈΠΈ ΠΈΠ· 2-Π³ΠΎ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ° ΠΏΠΎΡΠ΅ΡΡΠ»ΠΎΡΡ NOT LIKE
ΡΡΠ»ΠΎΠ²ΠΈΠ΅. ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ UNION ALL
Π½Π°ΡΠ°Π» Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π΄Π²Π°ΠΆΠ΄Ρ β ΡΠ½Π°ΡΠ°Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ ΠΏΠΎ Π½Π°ΡΠ°Π»Ρ ΡΡΡΠΎΠΊΠΈ, Π° ΠΏΠΎΡΠΎΠΌ Π΅ΡΠ΅ ΡΠ°Π· β ΠΏΠΎ Π½Π°ΡΠ°Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π ΠΏΡΠ΅Π΄Π΅Π»Π΅, Π²ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ 2Π³ΠΎ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ° ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ²ΠΏΠ°ΡΡΡ Ρ Π·Π°ΠΏΠΈΡΡΠΌΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ.
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΠΈΡΠΈΠ½Ρ?.. ΠΠ΅ Π²ΠΎΠΏΡΠΎΡ!
- ΡΠ°ΡΡΠΈΡΠΈΠΌ Π²Π΄Π²ΠΎΠ΅ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ Π²ΡΠ±ΠΎΡΠΎΠΊ
- Π½Π°Π»ΠΎΠΆΠΈΠΌ DISTINCT, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½Π°ΡΠ½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
WITH q AS (
( ... LIMIT <2 * N> + 10)
UNION ALL
( ... LIMIT <2 * N> + 10)
LIMIT <2 * N> + 10
)
SELECT DISTINCT
*
, (SELECT ...) sub_query
FROM
q
LIMIT 10 OFFSET <N>;
Π’ΠΎ Π΅ΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π² ΠΈΡΠΎΠ³Π΅, ΡΠΎΠ²Π½ΠΎ ΡΠΎΡ ΠΆΠ΅, Π½ΠΎ ΡΠ°Π½Ρ Β«ΠΏΡΠΎΠ»Π΅ΡΠ΅ΡΡΒ» Π²ΠΎ 2-ΠΉ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡ CTE ΡΡΠ°Π» ΡΠΈΠ»ΡΠ½ΠΎ Π²ΡΡΠ΅, Π΄Π° ΠΈ Π±Π΅Π· ΡΡΠΎΠ³ΠΎ, ΡΠΈΡΠ°Π΅ΡΡΡ ΡΠ²Π½ΠΎ Π±ΠΎΠ»ΡΡΠ΅.
ΠΠΎ ΡΡΠΎ Π½Π΅ ΡΠ°ΠΌΠ°Ρ ΠΏΠ΅ΡΠ°Π»Ρ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΠΎΠΏΡΠΎΡΠΈΠ» ΠΎΡΠΎΠ±ΡΠ°ΡΡ DISTINCT
Π½Π΅ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ, Π° ΡΡΠ°Π·Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠΌ Π·Π°ΠΏΠΈΡΠΈ, ΡΠΎ ΡΡΠ΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΎΠΌ ΠΏΠΎΠΏΠ°Π»ΠΎ ΠΈ ΠΏΠΎΠ»Π΅ sub_query β ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ, Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ DISTINCT
, Π±Π°Π·Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΆΠ΅ Π½Π΅ 10 ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠΎΠ², Π° Π²ΡΠ΅ <2 * N> + 10!
2.4: ΠΊΠΎΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΠ΅Π²ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ!
ΠΠΎΡ ΡΠ°ΠΊ Π²ΠΎΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΆΠΈΠ»ΠΈ β Π½Π΅ ΡΡΠΆΠΈΠ»ΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΡΠ΅Π΅ΡΡΡΠ΅ Β«Π΄ΠΎΠΊΡΡΡΠΈΡΡΒ» Π΄ΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ N ΠΏΡΠΈ Ρ ΡΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΎΠΌ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Β«ΡΡΡΠ°Π½ΠΈΡΡΒ» Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²Π½ΠΎ Π½Π΅ Ρ Π²Π°ΡΠ°Π»ΠΎ ΡΠ΅ΡΠΏΠ΅Π½ΠΈΡ.
ΠΠΎΠΊΠ° ΠΊ Π½ΠΈΠΌ Π½Π΅ ΠΏΡΠΈΡΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΎΡΠ΄Π΅Π»Π°, ΠΈ Π½Π΅ Π·Π°Ρ ΠΎΡΠ΅Π»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° β ΡΠΎ Π΅ΡΡΡ Π±Π΅ΡΠ΅ΠΌ ΠΈΠ· ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΊΡΡΠΎΡΠ΅ΠΊ, ΡΠΈΠ»ΡΡΡΡΠ΅ΠΌ ΠΏΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΏΠΎΡΠΎΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΡΡΠΎΡΠ΅ΠΊ (ΡΡΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ Π·Π° ΡΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ N), ΠΈ ΡΠ°ΠΊ ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠΊΡΠ°Π½.
Π ΠΎΠ±ΡΠ΅ΠΌ, Π² ΠΏΠΎΠΉΠΌΠ°Π½Π½ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ N Π΄ΠΎΡΡΠΈΠ³Π»ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΡΡΠΈ Π² 17K, Π° Π²ΡΠ΅Π³ΠΎ Π·Π° ΡΡΡΠΊΠΈ Π±ΡΠ»ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ Β«ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅Β» Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ 4K ΡΠ°ΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ ΡΠΌΠ΅Π»ΠΎ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠΆΠ΅ ΠΏΠΎ 1GB ΠΏΠ°ΠΌΡΡΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈβ¦
ΠΡΠΎΠ³ΠΎ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com