Я новичок в веб-сервисах amazon и создал экземпляр mySQL RDS.
В настоящее время я использую сервер db.t2.micro и настроил цикл, который вставляет 1000 записей в базу данных. Как видно из кода, для завершения этой операции требуется около 16 секунд.
Если бы я стремился получить скорость, чтобы 1000 вложений были завершены за 1 секунду, какие спецификации мне нужно было бы изменить для достижения этого?
<?php $time = time(); // connection crednetials // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $i = 0; while($i < 1000){ $sql = "INSERT INTO test (value) VALUES ('$i')"; if ($conn->query($sql) === TRUE) { // echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $i++; } $conn->close(); $time2 = time(); $diff = $time2 - $time; echo "Difference: ".$diff; ?>
благодаря!
Если вы используете пробную версию t2.micro и отложите 20 ГБ хранилища, вы столкнетесь с несколькими проблемами
Максимальное значение IOPS = 20 ГБ x 3 = 60 IOPS, для 1k записей, 1000/60 = 16,6 секунд. Итак, вы хотите получить 1000 iops, вы можете воспользоваться преимуществами gp2 на один GB 3 IOPS, выделить 330GB = 333 x 3 = 999 IOPS. После этого вы столкнетесь с ограничением передачи данных. Тем не менее, вы можете написать и вызвать хранимую процедуру MYSQL для имитации исходной вставки в RDS для подтверждения производительности ввода-вывода.
Mysql по-прежнему использует некоторый процессор даже для простой вставки записей. t2. * тип экземпляра просто дает вам непрерывную пакетную обработку, которая составляет только последние 30 минут, после чего она дросселируется ниже 25% от ЦП. Если у вас такая транзакция, попробуйте использовать c3 / c4 / m3 / m4 и т. Д.
Несмотря на то, что документ AWS о Storage for Amazon RDS может вызвать другой фактор, например, латентность сети между вашим веб-сервером и RDS, если они не находятся в одном месте.
Таким образом, лучший способ тестирования RDS – поставить тестовую хранимую процедуру в MYSQL RDS и вызвать их, как показано в этом вопросе . Существует нулевая латентность сети для удовлетворения вашей необработанной потребности в контроле.
Вот код, который копирует из упомянутого вопроса
DELIMITER $$ CREATE PROCEDURE InsertRand(IN NumRows INT, IN MinVal INT, IN MaxVal INT) BEGIN DECLARE i INT; SET i = 1; START TRANSACTION; WHILE i <= NumRows DO INSERT INTO rand_numbers VALUES (MinVal + CEIL(RAND() * (MaxVal - MinVal))); SET i = i + 1; END WHILE; COMMIT; END$$ DELIMITER ; CALL InsertRand(1111, 2222, 5555);
(Обновить) :
Пакетная вставка невозможна для базового приложения транзакции. Важно оптимизировать различные методы загрузки MySQL . К сожалению, такой метод, как LOAD DATA INFILE
, не применим к RDS.
Есть несколько подходов, которые я бы рекомендовал:
1 – Можете ли вы загружать вставки? В этом исполнении есть накладные расходы, поэтому, если вы можете делать 50, 100 за один раз, вы значительно уменьшите накладные расходы и тем самым уменьшите время выполнения.
2 – Если это не дает преимущества, я бы посмотрел на увеличение IOP вашего сервера.
Но я настоятельно рекомендую использовать (1) в качестве решения.