Прежде всего, чтобы иметь возможность эффективно оптимизировать, нужно знать, на что уходит время:
- PHP делает слишком много вычислений?
- у вас слишком много запросов SQL?
- у вас есть SQL-запросы, которые занимают слишком много времени?
- где твой сценарий проводит время?
С этой информацией вы можете попытаться выяснить:
- если вы можете уменьшить количество запросов SQL
- например, если вы делаете один и тот же запрос снова и снова, вы, очевидно, теряете время
- другая идея - «перегруппировать» запросы, если это возможно; например, используйте только один запрос для получения 10 строк вместо 10 запросов, которые все возвращают одну строку.
- если вы можете оптимизировать запросы, которые занимают слишком много времени
- либо с использованием индексов - те, которые являются полезными, обычно зависят от соединений и условий, которые вы используете
- или переписать запросы, если они "плохие"
- Об оптимизации операторов выбора вы можете взглянуть на: 7.2. Оптимизация SELECT и других операторов
- если PHP делает слишком много вычислений, можете ли вы сделать меньше вычислений?
- Может быть, не пересчитывать подобные вещи снова и снова?
- Или использовать более эффективные запросы?
- если PHP требует времени, а сервер SQL не перегружен, использование параллелизма (запуск нескольких вычислений одновременно) также может помочь ускорить весь процесс.
Тем не менее: это довольно специфический вопрос, и ответы, вероятно, будут также довольно конкретными - это означает, что может потребоваться больше информации, если вам нужен более общий ответ ...
Редактировать после ваших правок
Поскольку у вас есть только простые запросы, все может быть немного проще ... Может быть.
- Прежде всего: вам нужно определить тип запросов, которые вы делаете.
- Я предполагаю, что из всех ваших запросов вы можете определить некоторые "типы" запросов.
- например: «
select * from a where x = 12
» и «select * from a where x = 14
» относятся к одному и тому же типу: один и тот же выбор, одна и та же таблица, предложение же - только изменение значения
- как только вы узнаете, какие запросы используются чаще всего, вам нужно проверить, оптимизированы ли они: использование
EXPLAIN
поможет
- (при необходимости, я уверен, что некоторые люди смогут помочь вам понять его вывод, если вы предоставите его вместе со схемой вашей БД (таблицы + индексы))
- При необходимости: создать правильные индексы - это своего рода сложная / специфическая часть ^^
- также для этих запросов может оказаться полезным уменьшение количества запросов ...
- когда вы закончите с часто используемыми запросами, пора идти с запросами, которые занимают слишком много времени; использование
microtime
из PHP поможет вам выяснить, какие из них
Перед этим, чтобы выяснить, работает ли PHP слишком много или это MySQL, можно просто использовать команду "top" в Linux или "менеджер процессов" (я не в Windows, и не используйте его на английском - настоящее имя может быть чем-то другим) .
Если PHP потребляет 100% ресурсов процессора, у вас есть виновник. Если MySQL съест весь процессор, у вас тоже есть виновник.
Когда вы знаете, какой из них работает слишком много, это первый шаг: вы знаете, что оптимизировать в первую очередь.
Я вижу из вашей части кода, что вы:
- прохождение 10000 элементов один за другим - должно быть легко разделить их на 2 или более фрагментов
- с использованием DOM и XPath, которые могут потреблять некоторый процессор на стороне PHP
Если у вас многоядерный ЦП, идея (которую я бы попробовал, если бы увидел, что PHP потребляет много ЦП) должна распараллелить.
Например, вы можете запустить одновременно два экземпляра PHP-скрипта:
- тот, который будет иметь дело с первой половиной URL
- SQL-запрос для этого будет выглядеть как "
select * from urls where id < 5000
"
- и другой, который будет иметь дело со второй половиной URL
- его запрос будет выглядеть как "
select * from urls where id >= 5000
"
Вы получите немного больше параллелизма в сети (вероятно, не проблема) и в базе данных (база данных знает, как работать с параллелизмом, и 2 сценария, использующих ее, обычно не будут слишком большими) , но вы сможете обрабатывать почти вдвое одинаковое количество документов одновременно.
Если у вас 4 процессора, разделите список URL-адресов на 4 (или даже больше; выясните методом проб и ошибок) части тоже подойдут.