У меня есть около 400 тысяч строк в базе данных. Все запросы в этом наборе данных оптимизированы для возврата менее чем за 0,4 с и работают хорошо. Однако мне нужно добавить дополнительное поле под названием Территории, которое может включать от 0 до 250 территорий (любая страна в мире), обычно около 150. Конечно, «реляционный» способ добавить это будет добавить территорию с FKey к таблице продуктов, но когда я пытаюсь сделать это с помощью соединения, я обычно получаю запросы в диапазоне 2-7 с, поскольку сейчас я запрашиваю около 60 миллионов строк, и запрос выглядит примерно так:
SELECT product from table join ...
WHERE territories in ['USA', 'France', 'Germany']
ORDER BY some_field LIMIT 50
Это слишком медленно для требований приложения, и мне было интересно, как я мог бы ускорить этот запрос, используя какое-то потенциально плоское поле. Вот несколько идей, которые у меня были:
- Сохраните его как массив json (пробовал, производительность была даже хуже, чем при объединении).
- Сохраните это как набор (не не представляется возможным, так как установлен 8 байт , поэтому менее 100 значений).
- Сделайте что-то вроде поля полнотекстового поиска и индексируйте каждую страну как единое целое (может быть в порядке, но очень плохо для выполнения сортировки в конце)
- Используйте четыре BIGINT с растровым изображением в этих четырех полях для значений 240 (кажется, ужасная идея, но идея, тем не менее, у меня была).
Мое требование здесь - запрос должен быть возвращен менее чем за 0,5 с. Какой может быть лучший способ сделать это?