Вопрос знатокам PHP
Дано таблица белых слов wite_list, таблица текста table_zap. Задача, прогнать текст по вхождению белых слов, есть есть ставим флаг 1
Сделано так
$e=mysqli_query($connect,"select word from wite_list");
$mass=mysqli_fetch_array($e, MYSQLI_ASSOC);
do{
$dask=$mass['word'];
mysqli_query($connect,"UPDATE table_zap SET flag='1' WHERE zapros LIKE '%".$dask."%' AND flag='0' LIMIT 1 ");
}while($mass=mysqli_fetch_array($e, MYSQLI_ASSOC));
Работает но когда значений несколько тысяч здорово нагружает сервер. Может другое решение будет ?
Тут дело не в PHP, а в MySQL.
Производительность в твоем update-запросе зависит от того, насколько быстро БД локализирует необходимую строку в таблице. Даже если у тебя есть индексы на столбцах flag и zapros, в лучшем случае будет использоваться только один (flag). LIKE с % в начале шаблона не может использовать индексы. См также. https://dev.mysql.com/doc/refman/5.7/en/using-explain.html
У MySQL есть Full-Text Search Functions. Попробуй воспользоваться этим.
Кроме того, php-код ничего не делает, кроме как обновляет БД. Всю эту операцию можно перенести в хранимую процедуру, тем самым ты выиграeшь на overhead'е коммуникации php <-> mysql.
Ну и по php:
$mass=mysqli_fetch_array($e, MYSQLI_ASSOC); do { } while ($mass=mysqli_fetch_array($e, MYSQLI_ASSOC));
не верно. Должно быть так:
while ($mass=mysqli_fetch_array($e, MYSQLI_ASSOC)) { }
здесь же нужен перебор всего словаря, а не update по одному слову, поэтому и сделано в цикле, вытаскиваем каждое слово и проверяем на вхождение ставим флаг 1.
Мне ещё предлагали сделать массив из слов прямо в файле типа $word=array('black','lime'.......'green') всего 700 слов.
а потом подставлять в цикле wihile а здесь уже update с подставкой like%% не знаю насколько это облегчит обработку, я думаю нагрузка идёт из за update потому что надо перебирать всю таблицу текста где записи тысячами и будут расти ещё.
Есть мысль сделать по select так как он быстрее работает, вытащить совпадения в переменную а потом 1 update вне цикла по всем совпадениям
да я всё уже нашёл решение, нет тут специалистов сидят одни п-лы и пишут откровенную лажу для лохов
тема закрыта, никто ничего вразумительного не написал просто чушь полнейшая, тошнит от вас
здесь же нужен перебор всего словаря, а не
-----
Здесь нужно учить SQL.
Причем не только синтаксис, но и цель применения.
Есть мысль сделать по
-----
Мысль должна быть - написать один правильный запрос на апдейт,
а не дергать базу без необходимости.
Если не получается - смотреть что в структуре базы напутано.
На вскидку - у тебя просматривается почти вся таблица текстов.
Причем - полным сканом, т.е. самым дорогим способом.
В тоже самое время тебе для поддержания базы в порядке надо
просматривать всего одну запись.
Я бы подумал об двух триггерах на инсерт.
не в архитектуре, а в имплементации
-----
Да, там есть ошибка при пустой таблице.
Но скорее всего она не встречается т.к. у него 700 слов есть изначально.
А решать придется не на уровне имплементации - там все одно будет плохо, а на уровне архитектуры.