@Dimas123

Как ускорить запрос SELECT mysql?

Есть запрос к таблице data (столбцы: id / упакованный большой массив / parser / parsersecond)
В запросе берется строка
$query = "SELECT * FROM `data` WHERE parsersecond='0' AND parser='1'  LIMIT 1;";

обрабатываются данные и в этой строке меняется parsersecond='0' на '1'

Следующий запрос, уже промотает эту строку, так как parsersecond стал '1' и возьмет следующую где '0'. Проблемы начинаются когда обработаны десятки тысяч строк и у них становится parsersecond='1' . Следующий запрос выполняется всё дольше и дольше, так как проматываются эти parsersecond='1'.

Я ещё использую $res = mysql_query($query); я прочитал, что это устарело. Пока некогда изучать новое, но если это ускорит запросы изучу.

P. S. Я по гуглу изучал программирование, как небольшое хобби, так что слишком общие и научные объяснения могу не понять.
  • Вопрос задан
  • 4867 просмотров
Решения вопроса 2
3vi1_0n3
@3vi1_0n3
1) Добавить индексы на поля parsesecond и parser
2) Если делается просто поиск строки, а вторым запросом замена значения одного поля и данные никак не используются, то может быть просто сразу использовать UPDATE `data` SET parsesecond='1' WHERE parsersecond='0' AND parser='1'
Ответ написан
hedint
@hedint
Senior front-end developer
Я бы вообще использовал другую логику в вашем приложении (правда, это зависит от ваших целей и сильно завязано на то, что делает ваше приложение).
Если разбор данных (вы же их зачем-то получаете) осуществляется быстро, узкое место - база данных и кроме этого вам с этими данными ничего не надо делать, я бы делал так:
Извлекаем данные большими партиями (1000-10000).
Для извлечения используем наш primary index (id), который уникален, AUTO_INCREMENT и поиск по которому идет быстро.
после окончания операции фиксируем последний обработанный id (пишем в БД в отдельную таблицу, если планируете прерывать скрипт, или просто сохраняем в переменную, если не планируете), и повторяем все заново (обрабатываем новую порцию данных).
Запрос для извлечения был бы примерно таким:
SELECT * FROM data WHERE id > :last_id ORDER BY id ASC LIMIT :limit

где last_id - последний обработанный, limit - количество элементов в нашей порции данных.
Но, опять же, все это сильно зависит от специфики приложения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@iliyaisd
почему нельзя выбрать сразу все строки, обработать их и затем все сохранить?
Ответ написан
Ваш ответ на вопрос

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

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