Как в MySQL правильно искать фразу целиком

186
06 октября 2018, 14:10

Есть таблица с текстовым полем, содержащим ссылки. В разных строках таблицы эти ссылки произвольной длины. В таблице 14 млн строк. Мне нужно брать ссылку из произвольной строки и очень быстро находить ее дубли в других строках. Т.е. тут идет поиск по полю целиком, а не частичное совпадение.

Что я пробовал делать:

  1. сделал это поле типом text и искал вот так: where url='$url' - запрос обрабатывается около 10 секунд.
  2. сделал это поле типом varshar(1000) и сделал по нему индекс, и искал вот так: where url='$url' - запрос обрабатывается около 10 секунд, т.е. не дало никакого прироста.
  3. делать для этого поля fulltext-индекс не вижу смысла, т.к. я не ищу в нем частичные совпадения
  4. делать для этого поля поиск через where url like '%$url%' не вижу смысла, т.к. я не ищу в нем частичные совпадения
  5. делать для этого поля поиск через where url like '$url' не вижу смысла, т.к. это еще медленнее, чем url='$url'

Посоветуйте, как правильно, и главное - быстро, искать в таком случае?

Answer 1

Добавь ещё одно поле и сгенери в него хэш от ссылок. Любой короткий быстрый хэш. Например, CRC32. Уже это поле проиндексируй (можно целиком, а можно первые 2-3 байта - хватит вполне). И по этому полю ищи совпадения. А только потом проверяй сам урл.

Поиск по короткому (НЕ уникальному!) хэшу даст огромный прирост скорости. Но всё равно придётся после этого сравнить и сами урлы. Поэтому индекс лучше сделать составным.

..,
crc32 char, // byte, clob, blob.. raw
url varchar,
index idx crc32(4), url(8),
..,

А искать потом например так:

where crc32 = :crc32
    and url = :url

Должно просто летать!

READ ALSO
Как получить позицию строки в выдаче MYSQL?

Как получить позицию строки в выдаче MYSQL?

Выполняем запрос: SELECT id, name, rank FROM table ORDER BY rank DESC, id DESC Мне нужно получить позицию в этой выдаче строки с фиксированным id (например id=50)Как это...

180
Mysql workbench внезапно закрылось ubuntu 16.04

Mysql workbench внезапно закрылось ubuntu 16.04

помогите решить проблемуНе знаю в какую сторону капать

158
Какой тип отображения у flexbox элемента

Какой тип отображения у flexbox элемента

Как мы знаем в основном html-теги поделены на несколько типов отображения, часто используемые это inline и block

175