Вот выражение, которое будет использовать тот меньше вызова метода, чем пример quackingduck.
'%011d' % rand(1e10)
Один протест, 1e10
Float
, и Kernel#rand
заканчивает тем, что звонил to_i
на нем, таким образом, для некоторых более высоких значений у Вас могли бы быть некоторые несоответствия. Чтобы быть более точными с литералом, Вы могли также сделать:
'%011d' % rand(10_000_000_000) # Note that underscores are ignored in integer literals
First of all, to be able to optimize efficiently, you need to know what it taking time :
С этой информацией вы можете попытаться выяснить:
Тем не менее: это вполне конкретный вопрос, и ответы, вероятно, будут также довольно конкретными - а это значит, что может потребоваться дополнительная информация, если вы хотите большего, чем общий ответ .. .
Редактировать после ваших правок
Поскольку у вас есть только простые запросы, все может быть немного проще ... Может быть.
select * from a where x = 12
» и « select * from a, где x = 14
"имеют один и тот же тип: тот же выбор, та же таблица, то же предложение where - изменяется только значение EXPLAIN
поможет
microtime
from PHP will help you find out which ones those are
Перед этим, чтобы узнать, работает ли PHP слишком много или это MySQL, простой способ - использовать "верхний "команда в Linux или" диспетчер процессов " (я не использую Windows и не использую ее на английском языке - настоящее имя может быть другим) .
Если PHP является съедая 100% CPU, у вас есть виноват. Если MySQL съедает весь процессор, у вас тоже есть виноват.
Когда вы знаете, какой из них работает слишком много, это первый шаг: вы знаете, что оптимизировать в первую очередь.
Я вижу из вашей части кода что вы:
select * from urls where id <5000
» select * from urls where id> = 5000
» Вы получите немного больше параллелизма в сети (вероятно, не проблема) и в базе данных (база данных знает, как работать с параллелизмом, и 2 сценария, использующих ее, обычно не будет слишком много) , но вы сможете обрабатывать почти вдвое больше документов за одно и то же время.
Если у вас 4 ЦП, подойдет и разделение списка URL-адресов на 4 (или даже больше; выясняется методом проб и ошибок) .
Поскольку ваш запрос находится в одной таблице и не имеет группировки или упорядочивания, маловероятно, что запрос будет медленным. Я полагаю, проблема заключается в размере и количестве полей содержимого. Похоже, что вы храните весь HTML-код веб-страницы в своей базе данных, а затем извлекаете его каждый раз, когда хотите изменить пару значений на странице. Этой ситуации следует избегать, если это вообще возможно.
Большинство научных веб-приложений (например, BLAST) имеют возможность экспортировать данные в виде текстового файла с разделителями, такого как csv. Если это так для вас, вы можете подумать о реструктуризации своей таблицы URL-адресов, чтобы у вас был один столбец на поле данных в CSV. Тогда ваши запросы на обновление будут значительно быстрее, так как вы сможете выполнять их полностью на SQL, а не загружать всю таблицу URL-адресов в PHP, доступ и извлечение одной или нескольких других записей для каждой записи URL и последующее обновление таблицы.
Предположительно, вы сохранили свои данные в виде веб-страниц, чтобы вы могли легко выгружать контент в браузер. Если вы измените схему своей базы данных, как я предложил, вам нужно будет написать шаблон веб-страницы, в который вы сможете вставить данные, когда захотите вывести их.
Knowing queries and table structures it would be easier.
If you cant give them out check if you have IN operator. MySQL tends to slow too much in there. Also try to run
EXPLAIN yourquery;
and see how it is executed. Sometimes sorting takes too much time. Try to avoid sorting on non-index columns.
внутренние соединения выполняются быстрее, чем левые или правые соединения.
Всегда ускорял выполнение моих запросов и размышлял конкретно о соединениях.
посмотрите настройки mysql в конфигурации можно отключить и т. д.
Если вы не используете индексы, это может быть основной проблемой. Есть еще много советов и приемов оптимизации. Лучше будет показать, т.е. ваш самый медленный запрос. Без входных данных помочь невозможно. Индексы и правильные соединения могут значительно ускорить это.
Если запросы будут возвращать одни и те же данные, вы можете сохранить их в файле или в памяти и выполнять их только один раз.
2 миллиона записей - это немного.
Прежде чем приступить к оптимизации, необходимо выяснить, где находится узкое место. Можете ли вы запустить сценарий на меньшем наборе данных в целях тестирования?
В этом случае вам следует настроить такой тест, а затем профилировать код. Вы можете использовать специальный профилировщик, такой как Xdebug , или, если вы сочтете его слишком сложным для настройки (на самом деле это не так сложно, но, похоже, вы уже немного углубились), вы можете чувствовать себя более комфортно с ручным подходом. Это означает запуск таймера перед частями вашего кода и его остановку после, а затем вывод результата. Затем вы можете сузить область, которая является самой медленной.
Как только вы это получите, мы сможем дать более конкретные ответы, или, возможно, вам будет очевидно, что делать.