- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Собственно столкнулся с такой проблемой. Надо хранить на сайте данные, таким образом что URL выступает в роли индекса. Пока попадались URL'ы короче 255 символов все было отлично, MySQL тип данных VARCHAR(255). Но оказалось что URL'ы длиннее 255 символов тоже попадаются, и отмахнуться от них нельзя.
Как правильно поступить? Городить какой-то свой собственный storage engine как-то не хочется. Наверное скорее речь должна идти о неком универсальном и быстроработающем алгоритме, который свертывает длинные URL'ы в более короткие строки, сохраняя взаимнооднозначное соответствие. Обычный md5 - сомневаюсь из-за его скорости работы.
а varchar на text нельзя заменить?
а varchar на text нельзя заменить?
По TEXT нельзя сделать PRIMARY KEY
Городить отдельную таблицу ID|URL (TEXT)
А в рабочую таблицу вместо URL писать ID из новой таблицы.
Индекс может содержать только первые N символов. Подробности в документации.
Primary key, разумеется, не может. Но раз вам это надо, а нигде не поддерживается это повод задуматься - а не делаете ли вы фигню ?
Ага. Вот. Я тут прочитал, что MySQL может делать индексное поле 767 байт (или 1000 байт, по разным источникам). Поскольку у меня до сих пор URL'ы были в UTF-8 то мне давало сделать индексное поле 333 символа. Это мало. Но если заменить кодировку с UTF-8 на latin1 то будет уже получше. Наверное это решение. 1000 это в общем случае тоже мало, но как временное решение - подойдет.
Обычный 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
Городить отдельную таблицу ID|URL (TEXT)
А в рабочую таблицу вместо URL писать ID из новой таблицы.
Индекс может содержать только первые N символов. Подробности в документации.
Primary key, разумеется, не может. Но раз вам это надо, а нигде не поддерживается это повод задуматься - а не делаете ли вы фигню ?
Нужно выполнять в таблице быстрый поиск по URL и гарантировать уникальность URL в таблице. Как это можно сделать иначе, чем назначив URL в качестве PRIMARY KEY?
Нужно выполнять в таблице быстрый поиск по URL и гарантировать уникальность URL в таблице. Как это можно сделать иначе, чем назначив URL в качестве PRIMARY KEY?
Ну если просто быстрый поиск и вам не нужно возвращать УРЛ, тогда md5 и всё. Будет уникальный всегда.
Можно как ещё сделать.
Текущий столбец переименовать и сделать TEXT, чтобы всё равно хранился урл. А рабочий столбец в MD5
Можно как ещё сделать.
Текущий столбец переименовать и сделать TEXT, чтобы всё равно хранился урл. А рабочий столбец в MD5
Да я так думал. Сделать index_url и full_url. В index_url хранить или сам url если он короче 255 символов или md5 от урла, если он длиннее. (чтобы лишний раз md5 не считать). Ну а в full_url всегда полный url как он есть, для отображения.
Нужно выполнять в таблице быстрый поиск по URL и гарантировать уникальность URL в таблице. Как это можно сделать иначе, чем назначив URL в качестве PRIMARY KEY?
Так индекс не обязан быть primary key. Просто индекс по части строки :
CREATE TABLE table2 (
id int(11) primary key,
url varchar(1024) not null ,
INDEX ttt (url (128))
);
Да, такой индекс не гарантирует уникальность в самой субд. Но при определенных допущениях и на это можно пойти.
Поиск будет быстрый.