SharkyFLY
@SharkyFLY

Поиск большого количества записей в mysql

Есть БД (mysql) с большим количеством записей (больше миллиона) в формате || *id* || *word* || *value* ||. Есть массив со списком значений для поиска в column1. То есть

БД

|| *id* || *word* || *value* ||
|| 1 || val1 || 12 ||
|| 2 || val2 || 13 ||
|| 3 || val3 || 33 ||



Массив
$word[] = "val1";
$word[] = "val3";


массив как и сама бд может быть очень большим… как сформировать запрос чтоб минимально нагружая базу получить значения из колонки value к словам из массива $word
  • Вопрос задан
  • 3340 просмотров
Решения вопроса 1
shushu
@shushu
Всё таки рекомендую использовать

WHERE word in ('a', 'b', 'c') но с лимитом, например в 100 штук (поигратся нужно с подбором лимита)

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

+ индекс должен быть на word
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@Dzen_Marketing
Индексы хоть есть?
Ответ написан
archibaldtelepov
@archibaldtelepov
1. какой процент слов для поиска в массиве от общего количества записей?
2. Если меньше 1% (я не помню, до какого значения использование индекса актуально), то может сделать двухходовую комбинацию вида:

1) создать таблицу временную с одной колонкой
2) залить в неё массив
3) выбрать все, что надо, написав JOIN созданной временной таблицы с основной, по которой ищем, содеинив их по значению поля word?
Ответ написан
Комментировать
WHERE `tabulka`.`sloupec` IN ('a','b','c')?
Ответ написан
@skvot
Если возможно, храните в массиве ID записей, выборка по ним должна быть быстрее.
Ответ написан
Кстати, подумай над тем, что бы соединить массив в 1 строку и сделать 1 запрос по любому из слов в строке. Если строка получается длинная можно разбить на несколько, в любом случае запрос станет быстрее. WAYS, сегодня в 13:56
Ответ написан
Комментировать
@chevanin
Могу ошибаться, но простой запрос на выборку 1М строк без сортировки особо базу нагрузить не должен.
Если в колонке *word* будут не сильно большие строки фикс. длины, то можно действительно попробовать покрывающий индекс или вынести таблицу целиком в оперативку (зависит от объема оперативки, можно напороться на своп и сделать только хуже)
Можно попробовать использовать NoSQL — как тут например tokarchuk.ru/2010/10/nosql-in-mysql-improve-mysql/
Можно какое-нибудь key-value хранилище использовать типа редиса…
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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