Я имею ввиду классическую задачу - найти slug страницы, поле в таблице БД ответственное за красивые URL. Допустим мне нужна страница site.com/pretty-url и я начинаю искать в поле slug значение "pretty-url". Но ведь это же затратно (или БД сама за меня решит эту проблему быстрого поиска? Учитывая, что для каждой записи изначально проставлены ID).
Не знаю, высосал ли я эту проблему или нет, но на мой обывательский взгляд это головная боль больших баз, которая была бы меньше, если бы я обращался сразу по ID без красивых урлов.
Если есть индекс на этом поле, то скорость поиска будет примерно такая же как и при доступе по id. Там точно такой же индекс, только не по тексту а по числу.
Вашу озабоченность можно понять. Для начала поставьте индекс у данного поля для того, чтобы запрос с поиском страницы по ее URL проходил быстрее (все равно ведь данные ищете, если не по этому полю, то по id). В идеале - кеширование.
Основной минус хранения красивого урла в БД - это дополнительный запрос. если страниц которым требуется такой урл не много, то по-моему проще его хранить в простом массиве, в отдельном файле
return array('my_castom_url_page' => 'real_url_page', ...);
Если посещаемость сайта не несколько миллионов человек в сутки, беспокойство лишнее. Знаю это не по теории, а из практики, у меня так работают сайты примерно c 2000 года, проблем c быстродействием поиска не наблюдается. Если же посетителей становится много, наверняка захочется сделать кеширование в redis например. Лучше подумать, что произойдет, когда захочется сделать иерархию (/uri, /uri/suburi и т.д.). Тут тоже проблемы особо нет, но задача точно поинтереснее.
Не очень понятны эти идеи про разность индексов. Да, индекс по четырем байтам целочисленного поля получится меньше и за счет этого быстрее, чем индекс из первых, скажем, 20-и символов текстового. Но разница будет не настолько значительная.
Для компьютера и число и строка - это набор байт. Что конкретно в эти байты записано - ему всё равно. Поиск по упорядоченному набору байт будет производиться одинаково.
Не стоит заранее переживать за производительность. От этого одни проблемы.
Как вариант, можно работать с урлом такого вида site.com/id/pretty-url
, и попросту игнорировать часть "pretty-url". Посмотрите по новостным сайтам - некоторые именно так работают.
Upd. Не заметил ваш комментарий выше. Тогда да, индексирование по полю урла будет работать сносно.
UPDATE articles SET url_hash=UNHEX(MD5(url));
SELECT *
FROM articles
WHERE url_hash = UNHEX(MD5('pretty-url'));
UNHEX(MD5(CONCAT('pretty-url', 'articles')))