Есть таблица
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, т.к. мне нужна только одна строка. Но база упорно перебирает объем всей таблицы для этого запроса.
Я понимаю, что в большинстве случаев этого можно избежать при использовании индексов для запроса. Но, что делать, если запрос производится раз в час, а строить для него индекс слишком накладно или вообще не возможно, в случае с поиском по регулярке?