Как хранить индекс длинных URL?

Solmyr
На сайте с 10.09.2007
Offline
501
658

Собственно столкнулся с такой проблемой. Надо хранить на сайте данные, таким образом что URL выступает в роли индекса. Пока попадались URL'ы короче 255 символов все было отлично, MySQL тип данных VARCHAR(255). Но оказалось что URL'ы длиннее 255 символов тоже попадаются, и отмахнуться от них нельзя.

Как правильно поступить? Городить какой-то свой собственный storage engine как-то не хочется. Наверное скорее речь должна идти о неком универсальном и быстроработающем алгоритме, который свертывает длинные URL'ы в более короткие строки, сохраняя взаимнооднозначное соответствие. Обычный md5 - сомневаюсь из-за его скорости работы.

project33
На сайте с 30.04.2011
Offline
94
#1

а varchar на text нельзя заменить?

Solmyr
На сайте с 10.09.2007
Offline
501
#2
project33:
а varchar на text нельзя заменить?

По TEXT нельзя сделать PRIMARY KEY

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3

Городить отдельную таблицу ID|URL (TEXT)

А в рабочую таблицу вместо URL писать ID из новой таблицы.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
N
На сайте с 06.05.2007
Offline
419
#4

Индекс может содержать только первые N символов. Подробности в документации.

Primary key, разумеется, не может. Но раз вам это надо, а нигде не поддерживается это повод задуматься - а не делаете ли вы фигню ?

Кнопка вызова админа ()
Solmyr
На сайте с 10.09.2007
Offline
501
#5

Ага. Вот. Я тут прочитал, что MySQL может делать индексное поле 767 байт (или 1000 байт, по разным источникам). Поскольку у меня до сих пор URL'ы были в UTF-8 то мне давало сделать индексное поле 333 символа. Это мало. Но если заменить кодировку с UTF-8 на latin1 то будет уже получше. Наверное это решение. 1000 это в общем случае тоже мало, но как временное решение - подойдет.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#6
Solmyr:
Обычный md5 - сомневаюсь из-за его скорости работы.

На моем ноутбуке

$ openssl speed md5

Doing md5 for 3s on 16 size blocks: 10348951 md5's in 3.00s

Doing md5 for 3s on 64 size blocks: 7595126 md5's in 3.00s

Doing md5 for 3s on 256 size blocks: 4226146 md5's in 3.01s

Doing md5 for 3s on 1024 size blocks: 1521229 md5's in 3.00s

Doing md5 for 3s on 8192 size blocks: 218379 md5's in 3.00s

OpenSSL 1.0.1e 11 Feb 2013

built on: Fri Jun 20 18:52:46 UTC 2014

options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)

compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DOPENSSL_NO_TLS1_2_CLIENT -DOPENSSL_MAX_TLS1_2_CIPHER_LENGTH=50 -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM

The 'numbers' are in 1000s of bytes per second processed.

type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes

md5 55194.41k 162029.35k 359433.02k 519246.17k 596320.26k

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Solmyr
На сайте с 10.09.2007
Offline
501
#7
LEOnidUKG:
Городить отдельную таблицу ID|URL (TEXT)

А в рабочую таблицу вместо URL писать ID из новой таблицы.
netwind:
Индекс может содержать только первые N символов. Подробности в документации.
Primary key, разумеется, не может. Но раз вам это надо, а нигде не поддерживается это повод задуматься - а не делаете ли вы фигню ?

Нужно выполнять в таблице быстрый поиск по URL и гарантировать уникальность URL в таблице. Как это можно сделать иначе, чем назначив URL в качестве PRIMARY KEY?

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#8
Solmyr:
Нужно выполнять в таблице быстрый поиск по URL и гарантировать уникальность URL в таблице. Как это можно сделать иначе, чем назначив URL в качестве PRIMARY KEY?

Ну если просто быстрый поиск и вам не нужно возвращать УРЛ, тогда md5 и всё. Будет уникальный всегда.

Можно как ещё сделать.

Текущий столбец переименовать и сделать TEXT, чтобы всё равно хранился урл. А рабочий столбец в MD5

Solmyr
На сайте с 10.09.2007
Offline
501
#9
LEOnidUKG:
Можно как ещё сделать.
Текущий столбец переименовать и сделать TEXT, чтобы всё равно хранился урл. А рабочий столбец в MD5

Да я так думал. Сделать index_url и full_url. В index_url хранить или сам url если он короче 255 символов или md5 от урла, если он длиннее. (чтобы лишний раз md5 не считать). Ну а в full_url всегда полный url как он есть, для отображения.

N
На сайте с 06.05.2007
Offline
419
#10
Solmyr:
Нужно выполнять в таблице быстрый поиск по URL и гарантировать уникальность URL в таблице. Как это можно сделать иначе, чем назначив URL в качестве PRIMARY KEY?

Так индекс не обязан быть primary key. Просто индекс по части строки :

CREATE TABLE table2 (

id int(11) primary key,

url varchar(1024) not null ,

INDEX ttt (url (128))

);

Да, такой индекс не гарантирует уникальность в самой субд. Но при определенных допущениях и на это можно пойти.

Поиск будет быстрый.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий