Kaleb уже дал вам решение (а Джоэл предупредил о производительности индекса в комментарии), но я хотел бы предложить другой маршрут, который будет хорошо масштабироваться. Если ваши столы никогда не станут слишком большими, вы можете игнорировать этот совет. Фактически, вы можете игнорировать это вплоть до того времени, когда вы ожидаете, что производительность понизится (или производительность будет фактически начала страдать) - это принцип YAGNI.
Базы данных почти всегда читают гораздо больше, чем пишут. Это означает, что правильное время, чтобы выяснить, когда URL начинается или содержит «/ q /», - это когда данные помещаются в таблицу, , а не каждый раз, когда вы извлекаете их. Это амортизирует стоимость вычислений (выполненных во время записи) во всех чтениях.
Для этого масштабируемого решения у вас должен быть совершенно отдельный столбец в таблице, например, "startsWithQ"
или "hasQ"
.
Затем с помощью триггера вставки / обновления установите этот столбец на основе URL-адреса, помещаемого в таблицу.
Тогда ваш запрос станет:
select * from MyURLs where hasQ = 'YES'
и, если у вас есть индекс для этого столбца, ваши запросы будут передаваться по очереди.
Если вы на самом деле смотрите на большинство проблем с базами данных, они обычно «мой запрос недостаточно быстр», а не «мой диск недостаточно большой». Обмен дискового пространства на скорость обычно является лучшим подходом.
Это может обеспечивать снижение производительности, если строка поиска '/q/%'
. Это должно быть профилировано, регулярно и в производстве - базы данных редко устанавливаются и забываются, поскольку производительность может меняться в зависимости от данных в таблицах - мера, не угадывайте .
Это будет , безусловно, обеспечит улучшение, если строка поиска будет '%/q/%'
, если только ваша база данных не является одним из тех очень редких зверей, у которого больше записей, чем чтений.