Рубрики
Uncategorized

Как ускорить производительность приложений с помощью Smart SQL-запросов.

Почему так много проблем с производительностью вызваны базой данных? Мы часто забываем, что каждый запрос не … Теги с базой данных, производительностью, производительностью, дежоптом.

Почему так много проблем с производительностью вызваны базой данных?

Мы часто забываем, что каждый запрос не зависит от других запросов. Если один запрос медленный, вряд ли повлияет на других … верно?

База данных является общим ресурсом, используемым всеми процессами, которые запускаются в вашем приложении. Даже только один плохо разработанный доступ может повредить производительность всей системы.

Привет, я Valerio Software Engineer и CTO на инспекторе. В этой статье я расскажу о некоторых интеллектуальных подходах к SQL-запросам, которые полностью изменили некоторые части нашей системы и улучшают производительность приложений для лучшего опыта клиента.

Если вы имеете дело с большими набором данных, процессами импорта/экспорта, алгоритмы агрегации данных и аналогичные проблемы, эти решения могут помочь вам значительно снизить потребление ресурсов по вашему заявлению и достичь значительной экономической экономии.

Вставить на двойное обновление ключа

Вставьте на дублируемое обновление ключа является одним из мельчайших известных положений MySQL, но это гарантирует невероятные улучшения производительности в некоторых конкретных случаях, которые могут буквально спасти ваши клиенты.

Благодаря этому пункту вы можете проинструктировать MySQL запустить оператор обновления в случае, если оператор INSERT выйдет не так из-за возможной дублирующейся клавиши в таблице.

Позвольте мне показать реальный мир.

CSV импорт/экспорт

Давайте представим процесс импорта списка пользователей из файла CSV, где каждая строка должна иметь уникальный адрес электронной почты. Наш скрипт должен вставлять новых пользователей и обновлять определенный пользователь, если адрес электронной почты уже существует.

Первая версия этого сценария может быть:

// CSV file content
$csv = [...];

foreach($csv as $row)
 {
    $user = User::firstWhere('email', $row['email']);

    if(!$user) {
        $user = new User()
    }

    $user->name = $row['name'];

    // "save" method is smart enough to update a record if it does not exists, otherwise create.
    $user->save();
}

Для каждой строки мы проверяем, если пользователь с заданным письмом уже существует в базе данных. Если пользователь существует сценарий обновления его имени и, чем сохранить, если пользователь не существует, сценарий создает новый экземпляр пользователя, а затем продолжается с помощью вставки.

В этом примере мы используем Красноречивый ORM Для взаимодействия с базой данных и методом «Сохранить ()» достаточно умно, чтобы обновить запись, если она не существует, создайте его в противном случае. В конце мы запустим SELECT, чтобы взять пользователь из базы данных, а другой запрос для вставки или обновления записи, поэтому два запроса для каждой строки в файле CSV.

Это означает, что для CSV с 500 000 строк нам необходимо запустить 1 миллион запросов (500K SELECT, 500К вставки или обновления).

Упростите код

Красноречивый, а также каждый другой достойный ORM, предоставляет какой-то ярлык для достижения такого рода операций, поэтому мы можем использовать метод UpdateOrteCreate для уменьшения количества строк для лучшего удочтения:

// CSV file content
$csv = [...];

foreach($csv as $row)
 {
    User::updateOrCreate(
        // Identify record by this columns
        [
            'email' => $row['email']
        ],
        // Other fields to fill
        [
            'name' => $row['email']
        ]
    ]);
}

Способ имеет действительно чистое имя и обеспечивает полезную функциональность, но этого недостаточно, потому что она содержит такую же проблему: он запускает два запроса на строки CSV.

Слишком много запросов означает слишком много времени, CPU и использование памяти. Вместо этого мы стремимся уменьшить количество утверждений баз данных для оптимизации производительности и потребления ресурсов скриптом.

Как использовать «На дублирующем ключ»

Этот пункт похож на оператор «TRY/CALL», а для SQL. Вот необработанный пример:

INSERT INTO users (email, name) 
    VALUES ('support@inspector.dev', 'Valerio')
ON DUPLICATE KEY 
    UPDATE users SET name = 'Valerio';

Это имеет действительно простое поведение:

  • Попробуйте вставить запись с данной информацией;
  • Если нет ошибок, он выполняет вставку как обычно;
  • Если запрос пожарит ошибку «дублирующего ключа», это процедуры со вторым запросом;

Благодаря этому пункту мы можем переместить форму оператора «если» PHP в базу данных, добавить количество запросов против самой базы данных.

Пойдем дальше

Мы можем использовать этот оператор SQL также для объемных операций для получения экспоненциального улучшения производительности. Мы можем добавить несколько вставлять и использовать функцию значений для ссылки правильного поля, такое как переменная внутри цикла.

INSERT INTO users (email, name) 
    VALUES
        ('support@inspector.dev', 'Valerio'),
        ('support@inspector.dev', 'Valerio Barbera'),
        ('frank@gmail.com', 'Frank'),
        ('seb@gmail.com', 'Sebastian')
ON DUPLICATE KEY 
    UPDATE users SET name = VALUES(name);

Мы могли бы импортировать весь CSV с одним запросом … в теории.

В сценарии реальной жизни запрос имеет ограничение длины, и может быть более разумным не делать все в одной операции, чтобы избежать ошибок памяти. Мы можем кусочка CSV в дополнительных массивах из 1000 элементов и запускаемых запросов с 1.000 Вставкой внутри:

/ CSV file content
$csv = [...];
$chunks = array_chunk($csv, 1000);

foreach($chunks as $chunk) {
    foreach($chunk as $row) {
        User::updateOrCreate(
            // Identify record by this columns
            [
                'email' => $row['email']
            ],
            // Other fields to fill
            [
                'name' => $row['email']
            ]
        ]);
    }
}

1.000 — это просто пример, основанный на ваших ресурсах сервера, вы можете увеличить или уменьшить этот номер. Самое главное, что мы сократили количество запросов от 500 000 до 500.

Медицинский метод Upsert

Eloquent ORM предоставляет метод Upsert, который реализует эту стратегию для вас под капотом.

User::upsert([
    ['email' => 'support@inspector.dev', 'name' => 'Valerio', 'age' => 25],
    ['email' => 'support@inspector.dev', 'name' => 'Valerio Barbera', 'age' => 35]
], ['email'], ['name', 'age']);

Первый аргумент метода состоит из значений для вставки или обновления, а вторым аргументом перечислены столбец (ы), которые однозначно идентифицируют записи в соответствующей таблице. Третий и окончательный аргумент метода — это массив столбцов, которые должны быть обновлены, если в базе данных уже существует соответствующая запись.

Чтобы позволить методу выполнять свое задание, это требует столбцов во втором аргументе метода UPSERT, чтобы иметь «первичный» или «уникальный» индекс.

Вывод

Я надеюсь, что один или несколько из этих советов могут помочь вам создать более прочный и масштабируемый программный продукт.

Я использовал красноречивый ORM, чтобы написать код с примерами кода, но вы можете использовать эти стратегии со всеми крупными организациями одинаково, так же. Как я часто говорю, инструменты должны помочь нам реализовать эффективную стратегию. Стратегическое мышление — это ключ, чтобы дать долгосрочную перспективу нашим продуктам.

Новый к инспектору?

Создание среды мониторинга, специально разработанной для разработчиков программного обеспечения, избегая конфигурации серверов или инфраструктуры, с которой многие разработчики ненавидят иметь дело.

Благодаря инспектору вам никогда не будет необходимости устанавливать вещи на уровне сервера или сделать сложную конфигурацию в нашей облачной инфраструктуре.

Инспектор работает с легкой программной библиотекой, которую вы можете установить в своем приложении, как и любые другие зависимости. В случае, если у вас есть наш официальный Пакет Larave к вашим услугам. Разработчики не всегда удобные установки и настройки программного обеспечения на уровне сервера, поскольку эти установки вышли из жизненного цикла разработки программного обеспечения или даже управляются внешними командами.

Подробнее посетите наш сайт для более подробной информации: https://inspector.dev/laravel/

Оригинал: «https://dev.to/inspector/how-to-accelerate-application-performance-with-smart-sql-queries-4ggj»