MariaDB 10.1.7: Почему запросы, требующие фуллскана таблицы, при наличии поля MEDIUMTEXT, выполняются невероятно долго?

Есть таблица
id (int),
url (varchar)
html (mediumtext)

Есть и другие поля - но это не важно.
Средний размер поля html 1 MB. Всего 20 000 записей.
Если сделать к этой таблице запрос, который вызовет фуллскан таблицы, то этот запрос будет выполняться ~30 мин. Например (просто для теории) SELECT * FROM `table_name` WHERE url RLIKE "http://no_domain" LIMIT 1.

Если же явно указать, что в выдаче нам поле html не нужно, то запрос выполнится за ~ 10 милисекунд. Например: SELECT id FROM `table_name` WHERE url RLIKE "http://no_domain" LIMIT 1

Похоже, что при фуллскане таблицы база вытаскивает для каждой строки поля типа TEXT с диска, даже если оно совершенно не нужно для выполнения поиска (в данном случае в запросе фигурирует только url). На мой взгляд, лучше бы она сначала нашла нужные строки и уже при выдаче отдавала их с полями типа TEXT, т.к. мне нужна только одна строка. Но база упорно перебирает объем всей таблицы для этого запроса.

Я понимаю, что в большинстве случаев этого можно избежать при использовании индексов для запроса. Но, что делать, если запрос производится раз в час, а строить для него индекс слишком накладно или вообще не возможно, в случае с поиском по регулярке?
  • Вопрос задан
  • 466 просмотров
Решения вопроса 1
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
SELECT * FROM `table_name` WHERE id IN ( SELECT id FROM `table_name` url RLIKE "http://no_domain" LIMIT 1)
?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Wol_fi
php, js, mysql, highload
Немного не понял вашей проблемы. Вытягивайте сначала id через SELECT id FROM `table_name` WHERE url RLIKE "http://no_domain" LIMIT 1 , а потом уже всё через SELECT * FROM table_name WHERE id = previos_result_id .
А то что * запросы вытягивают все поля, и в случае запроса без использования индекса, берётся каждая строка и сравнивается - это ж описано в документации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы