Deutsch

Вопрос знатокам PHP

1313  
R1111 местный житель28.02.21 16:30
28.02.21 16:30 

Дано таблица белых слов 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));


Работает но когда значений несколько тысяч здорово нагружает сервер. Может другое решение будет ?

Web Site maker, Erstellen von Internetseiten und SEO Optimierung
#1 
NightWatch коренной житель28.02.21 18:11
NightWatch
NEW 28.02.21 18:11 
в ответ R1111 28.02.21 16:30

Тут дело не в 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)) {
}
#2 
Murr патриот28.02.21 22:06
Murr
NEW 28.02.21 22:06 
в ответ R1111 28.02.21 16:30

Может другое решение будет ?

-----

Может.

Мне вот непонятно зачем тащить словарь на клиента...

Мне опять непонятно зачем делать пословный поиск...

 like '%'||wite_list.field||'%'
#3 
Murr патриот28.02.21 22:13
Murr
NEW 28.02.21 22:13 
в ответ NightWatch 28.02.21 18:11

Должно быть так:

-----

Все данные уже на сервере - на клиенте никаких повторяемых действий быть не должно - отправить один запрос на апдейт поля по заданному критерию и всe...

#4 
R1111 местный житель01.03.21 07:40
NEW 01.03.21 07:40 
в ответ Murr 28.02.21 22:13

будьте любезны покажите код вашего решения

Web Site maker, Erstellen von Internetseiten und SEO Optimierung
#5 
R1111 местный житель01.03.21 08:00
NEW 01.03.21 08:00 
в ответ R1111 01.03.21 07:40

здесь же нужен перебор всего словаря, а не update по одному слову, поэтому и сделано в цикле, вытаскиваем каждое слово и проверяем на вхождение ставим флаг 1.

Мне ещё предлагали сделать массив из слов прямо в файле типа $word=array('black','lime'.......'green') всего 700 слов.

а потом подставлять в цикле wihile а здесь уже update с подставкой like%% не знаю насколько это облегчит обработку, я думаю нагрузка идёт из за update потому что надо перебирать всю таблицу текста где записи тысячами и будут расти ещё.

Есть мысль сделать по select так как он быстрее работает, вытащить совпадения в переменную а потом 1 update вне цикла по всем совпадениям

Web Site maker, Erstellen von Internetseiten und SEO Optimierung
#6 
NightWatch коренной житель01.03.21 11:13
NightWatch
NEW 01.03.21 11:13 
в ответ Murr 28.02.21 22:13

Здесь это не при чем. Я указал на ошибку не в архитектуре, а в имплементации. Читаем доку на предмет, что возвращает mysqli_fetch_array, и как работает while и do..while.

#7 
R1111 местный житель01.03.21 12:44
NEW 01.03.21 12:44 
в ответ NightWatch 01.03.21 11:13, Последний раз изменено 01.03.21 12:45 (R1111)

да я всё уже нашёл решение, нет тут специалистов сидят одни п-лы и пишут откровенную лажу для лохов

тема закрыта, никто ничего вразумительного не написал просто чушь полнейшая, тошнит от вас

Web Site maker, Erstellen von Internetseiten und SEO Optimierung
#8 
Murr патриот01.03.21 14:04
Murr
NEW 01.03.21 14:04 
в ответ R1111 01.03.21 08:00

здесь же нужен перебор всего словаря, а не

-----

Здесь нужно учить SQL.

Причем не только синтаксис, но и цель применения.


Есть мысль сделать по

-----

Мысль должна быть - написать один правильный запрос на апдейт,

а не дергать базу без необходимости.

Если не получается - смотреть что в структуре базы напутано.


На вскидку - у тебя просматривается почти вся таблица текстов.

Причем - полным сканом, т.е. самым дорогим способом.

В тоже самое время тебе для поддержания базы в порядке надо

просматривать всего одну запись.

Я бы подумал об двух триггерах на инсерт.

#9 
Murr патриот01.03.21 14:09
Murr
NEW 01.03.21 14:09 
в ответ NightWatch 01.03.21 11:13

не в архитектуре, а в имплементации

-----

Да, там есть ошибка при пустой таблице.

Но скорее всего она не встречается т.к. у него 700 слов есть изначально.

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

#10 
NightWatch коренной житель01.03.21 18:46
NightWatch
NEW 01.03.21 18:46 
в ответ R1111 01.03.21 12:44

d09fd0b8d0b7d0b4d0bed0b1d0bed0bb20d0b7d0b4d0b5d181d18c20d182d0bed0bbd18cd0bad0be20d182d18b2e

#11 
vlad_s_69 старожил02.03.21 11:38
NEW 02.03.21 11:38 
в ответ R1111 28.02.21 16:30

попробуй array_uintersect, можешь написать свою колбек функцию для сравнения 2х массивов

#12 
AlexLeeds знакомое лицо07.04.21 17:09
NEW 07.04.21 17:09 
в ответ R1111 01.03.21 12:44

Скинь ссылку на вебсай

#13