Как правильно проиндексировать longtext в mysql?

Добрый день.

В Wordpress имеется таблица с данными о записях вида
meta_idpost_idmeta_keymeta_value
1post_views100500
............
10000034234post_views500100


meta_value имеет тип LONGTEXT.

В запросе требуется выбрать данные о записи с meta_key = 'post_views' и отсортировать по meta_value. Что-то вроде
SELECT post_id, meta_value FROM wp_postmeta WHERE meta_key = 'post_views' ORDER BY CAST(wp_postmeta.meta_value as DECIMAL(10,5)) DESC LIMIT 0, 5


Если записей будет много, то подобные запросы будут сильно "нагибать" сервер. Гугл подсказывает, что следует добавить индекс наподобие `key_value` (`meta_key`, `meta_value`(20)) и все будет ок.

Но EXPLAIN говорит, что при сортировке по meta_value все равно используется filesort среди всех записей с определенным meta_key. Так как же правильно проиндексировать поле meta_value таким образом, чтобы не использовался этот несчастный filesort?
  • Вопрос задан
  • 2673 просмотра
Решения вопроса 1
@jowee
Backend Developer
Вам надо избавиться от операции CAST над индексируемым полем.
Например, добавить поле `meta_value_casted` DECIMAL(10,5), писать туда результат операции, сортировать по нему и, соответственно, добавить индекс (`meta_key`, `meta_value_casted`)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@IceJOKER
Web/Android developer
fulltext search - слышали о нем ?))
очень быстрая зараза кстати + сортировка есть по ролевантности.
просто вбейте гугл , там дофига ответов )
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Ответ очевиден:

Чтобы отсортировать числовые значения, их надо записывать в колонку числовогго типа.

Всё остальное здесь предложенное, что в посте, что в каментах - традиционный русский способ удаления гланд автогеном через спину. Любые попытки как-то улучшить этот метод - несмываемый позор.
Ответ написан
Ваш ответ на вопрос

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

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