Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Опасность: Некорректные данные могут привести к SQL-инъекциям, XSS или другим атакам.
Как действовать: Всегда проверяйте входные данные на стороне сервера (не только на клиенте). Используйте whitelisting (разрешение только ожидаемых значений) вместо blacklisting (запрета нежелательных). Экранируйте или очищайте данные перед их использованием, особенно для HTML или SQL.
Опасность: SQL-инъекции возможны при динамическом составлении SQL-запросов.
Как действовать: Используйте параметризованные запросы (prepared statements) для взаимодействия с базой данных. Не включайте пользовательский ввод непосредственно в запросы.
Опасность: Утечка конфиденциальных данных, таких как пароли или персональные данные.
Как действовать: Никогда не храните пароли в открытом виде. Используйте сильные алгоритмы хэширования, такие как bcrypt или Argon2. Шифруйте чувствительные данные перед их хранением или передачей. Используйте TLS (SSL) для защиты данных при передаче.
Опасность: Вредоносный скрипт может быть внедрен и выполнен в браузере пользователя.
Как действовать: Всегда экранируйте данные, которые отображаются в HTML, JavaScript или атрибутах. Используйте контекстно-зависимую экранизацию (например, HTML, JavaScript или URL-экранирование). Ограничивайте возможность загрузки вредоносного содержимого, используя заголовок Content Security Policy (CSP).
Опасность: Злоумышленник может заставить пользователя выполнить действие от его имени.
Как действовать: Используйте уникальные токены CSRF в запросах (например, в форме или заголовке). Ограничивайте методы запросов (например, PUT/POST) для выполнения важных операций. Проверяйте заголовок
Referer или Origin для подтверждения источника запроса.Опасность: Злоумышленник может использовать уязвимость в вашем коде для получения привилегий.
Как действовать: Давайте минимально необходимые права как для пользователей, так и для сервисов. Применяйте принцип наименьших привилегий на уровне кода, базы данных и системного доступа. Ограничивайте доступ к конфиденциальным данным.
Опасность: Устаревшие библиотеки могут содержать уязвимости.
Как действовать: Используйте актуальные версии библиотек и фреймворков. Следите за сообщениями о безопасности и патчами в используемых технологиях.
Опасность: Некорректная обработка ошибок может раскрыть внутреннюю информацию системы.
Как действовать: Не показывайте пользователям технические детали ошибок (например, трассировки стека). Логируйте ошибки на стороне сервера, но избегайте записи конфиденциальных данных в логи. Создавайте понятные сообщения об ошибках для пользователей, не раскрывая внутренние механизмы.
Опасность: Неправильные настройки среды выполнения, серверов или библиотек могут оставить приложение уязвимым.
Как действовать: Ограничьте доступ к административным интерфейсам через IP или авторизацию. Не храните конфиденциальные данные (например, ключи API) в коде. Используйте файлы конфигурации или хранилища секретов. Деактивируйте ненужные функции и модули в среде выполнения.
Опасность: Угрозы включают угон сессий, слабые пароли и неподтверждённую личность.
Как действовать: Используйте безопасные механизмы аутентификации, такие как OAuth2. Ограничивайте время жизни сессий и добавляйте механизмы их завершения. Убедитесь, что сессионные токены передаются только через защищённые соединения (HTTPS).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
READ COMMITTED — видны только зафиксированные изменения.
REPEATABLE READ — данные остаются неизменными во время транзакции.
SERIALIZABLE — транзакции выполняются последовательно.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Это метод подтверждения личности пользователя, который требует предъявления двух различных факторов аутентификации. Эти факторы относятся к разным категориям и обеспечивают дополнительный уровень безопасности по сравнению с одной лишь аутентификацией, например, паролем.
Например: пароль, PIN-код или ответ на секретный вопрос.
Например: одноразовый код из SMS, аппаратный токен, приложение-аутентификатор (Google Authenticator, Authy).
Например: отпечаток пальца, скан лица или радужной оболочки глаза.
Даже если злоумышленник узнает ваш пароль, ему будет сложно получить доступ к устройству или коду второго фактора.
Одного украденного пароля недостаточно для получения доступа.
Подходит для широкого спектра приложений: от банковских сервисов до социальных сетей.
Генерируются приложениями-аутентификаторами или отправляются через SMS/email.
Физические ключи (например, YubiKey, ключи с поддержкой FIDO2).
Используется как второй фактор в сочетании с паролем.
Подтверждение входа через уведомление в мобильном приложении.
Возможны атаки через SIM-сваппинг или перехват сообщений.
Потеря устройства или токена затруднит доступ к аккаунту.
Требует больше времени и усилий от пользователя.
Ставь 👍 и забирай 📚 Базу знаний
Это метод подтверждения личности пользователя, который требует предъявления двух различных факторов аутентификации. Эти факторы относятся к разным категориям и обеспечивают дополнительный уровень безопасности по сравнению с одной лишь аутентификацией, например, паролем.
Например: пароль, PIN-код или ответ на секретный вопрос.
Например: одноразовый код из SMS, аппаратный токен, приложение-аутентификатор (Google Authenticator, Authy).
Например: отпечаток пальца, скан лица или радужной оболочки глаза.
Даже если злоумышленник узнает ваш пароль, ему будет сложно получить доступ к устройству или коду второго фактора.
Одного украденного пароля недостаточно для получения доступа.
Подходит для широкого спектра приложений: от банковских сервисов до социальных сетей.
Генерируются приложениями-аутентификаторами или отправляются через SMS/email.
Физические ключи (например, YubiKey, ключи с поддержкой FIDO2).
Используется как второй фактор в сочетании с паролем.
Подтверждение входа через уведомление в мобильном приложении.
Возможны атаки через SIM-сваппинг или перехват сообщений.
Потеря устройства или токена затруднит доступ к аккаунту.
Требует больше времени и усилий от пользователя.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Эта возможность означает, что изменения во внутренней реализации модуля, класса или сервиса не требуют изменений в коде, который взаимодействует с ним (то есть в клиентской части). Это достигается за счёт строгого разделения интерфейса (контракта) и реализации, что является ключевым принципом инкапсуляции и модульного программирования.
Позволяет вносить изменения или улучшения во внутреннюю логику без необходимости модифицировать код, использующий данный компонент.
Упрощает рефакторинг, обновления или замену компонентов системы.
Клиентский код остаётся неизменным и работает без ошибок, даже если внутренние детали реализации полностью поменялись.
Упрощает тестирование и замену частей системы на новые реализации (например, подмена мока на реальную базу данных).
Определяется контракт взаимодействия через интерфейс или абстрактный класс.
Клиентская часть работает с этим контрактом, не зная деталей реализации.
Пример: Интерфейс для работы с хранилищем данных
IStorage определяет методы save() и load(). Реализация может быть файловой, базой данных или облачным сервисом.Реализация должна быть заменяемой без нарушения работы клиентского кода. Это гарантирует, что изменение реализации не повлияет на функциональность.
Внутренние детали модуля или класса скрыты за чётко определённым интерфейсом. Клиентский код взаимодействует только с публичным API, не имея доступа к внутренним данным или методам.
Принципы проектирования (особенно Dependency Inversion Principle) способствуют отделению деталей реализации от интерфейсов.
Модули должны быть максимально независимыми друг от друга. Использование dependency injection (внедрение зависимостей) упрощает замену реализаций.
Клиентская часть работает с интерфейсом
IStorage, который предоставляет методы для чтения и записи данных. Изначальная реализация использует локальные файлы. Позже её заменяют на работу с базой данных. Поскольку клиентский код взаимодействует только с IStorage, никаких изменений в нём вносить не нужно.Допустим, класс обрабатывает данные с помощью метода
process(). Реализация может меняться (например, использование нового алгоритма), но интерфейс остаётся неизменным, поэтому клиентский код продолжает работать.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
RIGHT JOIN делает то же самое, но с правой таблицей, возвращая NULL для отсутствующих строк из левой таблицы.
INNER JOIN возвращает только строки, где есть совпадения в обеих таблицах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Это программный слой, предназначенный для защиты одной части системы от нежелательного влияния другой. Его основная задача — изолировать доменную логику вашей системы от сложностей или несовместимостей, возникающих при взаимодействии с внешними системами или устаревшими (легаси) модулями.
Предохранительный уровень действует как адаптер или переводчик, который преобразует данные, протоколы или API одной системы в формат, совместимый с другой. Это позволяет вам сохранить чистоту и целостность внутренней логики вашей системы, не погружаясь в детали внешних систем.
Когда ваша новая система должна работать с устаревшими модулями, которые имеют несовместимые данные, структуры или API.
Например, при интеграции с внешним API, который использует сложные или нестандартные форматы данных.
Когда внешняя система не соответствует вашей доменной модели, и требуется преобразование данных для их согласованности.
Для предотвращения прямой зависимости между вашим кодом и внешними библиотеками или сервисами, которые могут меняться.
ACL скрывает сложную логику преобразования данных или протоколов.
Ваша система взаимодействует только с ACL, который предоставляет упрощённый и чистый интерфейс.
ACL создаёт слой абстракции между вашим кодом и внешней системой.
Ваша бизнес-логика остаётся независимой от деталей внешних систем.
Изменения в внешних системах минимально затрагивают вашу внутреннюю логику — достаточно адаптировать ACL.
ACL можно тестировать отдельно от основной системы.
Защищает от проникновения устаревших решений или несовместимых структур в ваш код.
Уменьшает сложность кода за счёт явного разделения зон ответственности.
Ваше приложение взаимодействует с системой оплаты, которая возвращает данные в сложном JSON-формате. ACL преобразует этот JSON в понятный объект вашей системы, например,
PaymentDetails.Ваша новая система работает с устаревшей базой данных, где используются нестандартные структуры данных. ACL преобразует SQL-запросы и результаты в объекты вашего приложения, скрывая детали старой структуры.
Реализуйте интерфейс или набор методов, которые предоставляют доступ к функционалу внешней системы.
Упростите взаимодействие, предоставив единый интерфейс для вызова сложных операций.
Для преобразования данных из формата внешней системы в объекты вашей системы.
ACL должен быть изолирован, чтобы можно было проверять преобразования без необходимости вызывать внешнюю систему.
Для сложных систем может потребоваться значительное время на проектирование и реализацию ACL.
Преобразования данных или вызовы через ACL могут быть медленнее, чем прямое взаимодействие.
ACL нужно поддерживать, чтобы он оставался актуальным при изменениях внешних систем.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
PRIMARY KEY — уникальный идентификатор строки.
FOREIGN KEY — ссылка на ключ другой таблицы.
UNIQUE — значения в колонке должны быть уникальными.
NOT NULL — значение должно быть задано.
CHECK — проверка выполнения условий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Для современного подхода используйте static локальную переменную в методе getInstance, так как ее инициализация гарантированно потокобезопасна.
Экземпляр создаётся только один раз за всё время жизни приложения.
Реализация должна корректно работать при обращении из нескольких потоков.
Экземпляр создаётся только тогда, когда он нужен, а не заранее.
Включает двойную проверку перед созданием экземпляра. Сначала проверяется, существует ли экземпляр без блокировки, а затем с блокировкой создаётся объект, если он ещё не существует.
public class Singleton {
// Вариант с volatile для предотвращения оптимизаций компилятора
private static volatile Singleton instance;
// Закрытый конструктор для предотвращения создания объекта через `new`
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // Первая проверка (без блокировки)
synchronized (Singleton.class) { // Блокировка
if (instance == null) { // Вторая проверка (с блокировкой)
instance = new Singleton();
}
}
}
return instance;
}
}Реализуется с помощью статического внутреннего класса. Экземпляр создаётся лениво при первом вызове метода
getInstance().public class Singleton {
// Закрытый конструктор
private Singleton() {}
// Внутренний статический класс
private static class SingletonHelper {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHelper.INSTANCE;
}
}Реализация через
enum гарантирует, что будет создан только один экземпляр.public enum Singleton {
INSTANCE;
public void someMethod() {
// Реализация методов
}
}Экземпляр создаётся при загрузке класса. Не ленивая, но безопасная и простая.
public class Singleton {
// Экземпляр создаётся при загрузке класса
private static final Singleton INSTANCE = new Singleton();
// Закрытый конструктор
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}Рекомендуется для большинства случаев из-за простоты, потокобезопасности и ленивой инициализации.
Идеален, если требуется сериализация или простота реализации, но не подходит для классов, требующих параметров при создании.
Подходит, если требуется максимальная гибкость, но код становится сложнее.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
RIGHT JOIN возвращает все строки из правой таблицы и соответствующие строки из левой, добавляя NULL, если совпадений нет.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Тесты и подход разработки через тестирование (Test-Driven Development, TDD) оказывают значительное влияние на структуру, организацию и качество кода. Они стимулируют разработчиков писать более чистый, модульный и тестируемый код, следуя принципам хорошего дизайна.
Как тесты влияют: Для удобства тестирования разработчики разделяют большие методы и классы на мелкие, с чёткими зонами ответственности. В результате код становится более модульным, а его компоненты проще повторно использовать и изменять.
Как тесты влияют: Для изолированного тестирования классов и методов зависимости инвертируются и предоставляются через интерфейсы или моки. Это приводит к использованию принципа инверсии зависимостей (Dependency Inversion Principle) и снижению связности между модулями.
Как тесты влияют: Если метод или класс берёт на себя слишком много обязанностей, тестировать его становится сложно. Это побуждает разработчиков разделять функциональность, соблюдая SRP.
Как тесты влияют: Разработка через тесты требует определения интерфейсов и API до написания кода. Интерфейсы проектируются с упором на удобство использования, минимальный набор методов и простоту.
Как тесты влияют: Наличие тестов создаёт уверенность, что изменения в коде не сломают существующую функциональность. Это стимулирует регулярный рефакторинг, что улучшает организацию и качество кода.
Как тесты влияют: Хорошо написанные тесты документируют ожидаемое поведение кода, показывая, как он должен использоваться и какие результаты ожидать.
Как тесты влияют: Чтобы код был тестируемым, разработчики чаще соблюдают принципы проектирования:
SOLID: Принципы проектирования для создания гибких и расширяемых систем.
KISS: Сохранение кода простым.
DRY: Избежание повторений.
Как тесты влияют: Чтобы упростить тестирование, разработчики изолируют побочные эффекты (например, работу с БД, сетью, файловой системой) в отдельных компонентах.
Как тесты влияют: Написание тестов до основного кода (TDD) выявляет проблемы в проектировании и требованиях на ранних стадиях.
Если тесты плохо написаны, это может усложнить рефакторинг.
Написание тестов занимает больше времени на ранних этапах, но окупается в долгосрочной перспективе.
Новички могут столкнуться с трудностями при проектировании тестируемого кода.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Возникает в приложениях, использующих базы данных, когда из-за неправильной организации запросов вместо одного оптимального запроса выполняется один основной запрос и N дополнительных запросов. Это может существенно снизить производительность системы.
Представим, что у нас есть две сущности:
User и связанные с ним Posts. Приложение запрашивает список всех пользователей, а затем для каждого пользователя делает отдельный запрос, чтобы получить связанные с ним посты. Вместо одного запроса к базе данных выполняется: Один запрос для получения всех пользователей. N запросов для получения постов каждого пользователя.Итог: N+1 запросов.
Это неэффективно, так как количество запросов растёт линейно с увеличением количества данных, что приводит к большим задержкам.
Вместо выполнения N отдельных запросов для связанных данных, ORM можно настроить так, чтобы они загружались вместе с основным запросом. Например: В Hibernate это можно сделать с помощью
fetch join. В Django ORM используется метод select_related() или prefetch_related().Иногда автоматическая оптимизация ORM не работает идеально. В таких случаях можно написать кастомные SQL-запросы, используя соединения (
JOIN) для получения всех необходимых данных в одном запросе.Если данные редко меняются, можно использовать кэш (например, Redis или Memcached), чтобы минимизировать количество обращений к базе данных.
Использование инструментов мониторинга запросов (например,
SQLAlchemy профайлеры или Django Debug Toolbar) позволяет вовремя выявить проблему N+1 и устранить её.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
READ UNCOMMITTED — видны незавершённые изменения.
READ COMMITTED — видны только зафиксированные изменения.
REPEATABLE READ — предотвращает изменения данных, прочитанных транзакцией.
SERIALIZABLE — полная изоляция, все транзакции выполняются последовательно.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В Java происходит, когда объекты, которые больше не нужны, продолжают ссылаться в памяти, и сборщик мусора (Garbage Collector, GC) не может их освободить. Это может привести к росту потребления памяти и в конечном итоге к ошибке
OutOfMemoryError.Если объекты добавляются в коллекцию (например,
List, Map) и никогда не удаляются, они могут остаться в памяти, даже если больше не используются.public class MemoryLeakExample {
private static List<Object> list = new ArrayList<>();
public void addToList() {
list.add(new Object()); // Объекты накапливаются, даже если они больше не нужны.
}
}Часто утечка происходит, когда объекты, подписанные на события, не отписываются, даже если больше не используются.
class EventSource {
private List<EventListener> listeners = new ArrayList<>();
public void addListener(EventListener listener) {
listeners.add(listener);
}
}
class LeakingClass {
public LeakingClass(EventSource source) {
source.addListener(new EventListener() {
@Override
public void onEvent() {
// Обработка события
}
});
}
}Неправильное использование объектов с сильными ссылками, которые хранят данные временно, но остаются доступными слишком долго.
class Cache {
private Map<Key, Value> cache = new HashMap<>();
public void put(Key key, Value value) {
cache.put(key, value); // Объекты накапливаются и не очищаются.
}
}Использование лямбда-выражений или анонимных классов, которые удерживают ссылки на внешние объекты.
public class MemoryLeak {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
Runnable task = () -> list.add(new Object()); // Лямбда удерживает ссылку на list
task.run();
}
}Если поток продолжает работать или удерживает ссылки на объекты, которые больше не нужны, это может привести к утечке.
class LeakingThread {
public void startThread() {
Thread thread = new Thread(() -> {
while (true) {
// Бесконечный цикл, который не позволяет завершить поток
}
});
thread.start();
}
}Незакрытые соединения или потоки ввода/вывода могут удерживать ссылки на системные ресурсы.
public void readFile() {
FileInputStream fis = new FileInputStream("file.txt");
// Поток не закрыт
}Использовать профилировщики памяти, такие как VisualVM, YourKit, или JProfiler. Искать "утекшие" объекты, которые удерживаются ссылками, но больше не нужны.
Применять
WeakReference или WeakHashMap для временных данных.Удалять ненужные объекты из коллекций. Освобождать ресурсы, такие как потоки или соединения.
Удалять слушателей (listeners), когда они больше не нужны.
Использовать
try-with-resources для работы с потоками и соединениями.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Интерес к функциональному программированию (Functional Programming) растёт из-за изменений в требованиях к разработке современных приложений, таких как потребность в масштабируемости, управлении сложностью и обработке больших данных. Функциональное программирование предлагает преимущества, которые позволяют решать эти задачи более эффективно.
Функциональное программирование делает акцент на чистых функциях, которые не имеют побочных эффектов. Это упрощает разработку многопоточных приложений, поскольку отсутствует необходимость синхронизации общего состояния. Языки, такие как Scala, Clojure, и Haskell, предоставляют мощные инструменты для работы с параллелизмом и потоками данных, что важно в эпоху многоядерных процессоров.
Современные распределённые системы требуют минимизации работы с изменяемым состоянием. FP, с его подходом к неизменяемым данным, позволяет избегать проблем, связанных с изменяемостью, таких как гонки данных или сложные состояния.
Фреймворки, такие как Apache Spark и Apache Flink, используют концепции функционального программирования (например, операции над коллекциями, как
map, filter, reduce) для работы с большими данными. Это делает FP особенно полезным для обработки потоков данных и анализа больших объёмов информации.Код, написанный в функциональном стиле, становится легче для анализа и тестирования благодаря принципам:
Чистые функции: результат функции зависит только от входных данных.
Неизменяемость данных: данные не меняются после создания.
Декларативный стиль: упор на то, что должно быть сделано, а не как.
Основные императивные языки программирования (Java, Python, JavaScript, C#) добавляют функциональные возможности, такие как лямбды, стримы и функции высшего порядка. Это делает функциональный стиль более доступным для широкой аудитории разработчиков.
Исключение побочных эффектов уменьшает количество ошибок. Код становится проще для тестирования, так как функции можно протестировать в изоляции. Система типов в функциональных языках, таких как Haskell, гарантирует большую безопасность, что снижает вероятность ошибок в рантайме.
FP способствует созданию более модульного кода. Композиция функций позволяет легко строить новые функциональности из существующих компонентов.
Языки, такие как Elm, ReasonML, и фреймворки, например React (с концепцией функциональных компонентов), активно используют принципы функционального программирования. Это позволяет создавать приложения с минимальным количеством багов и высокой предсказуемостью поведения.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Обнаружение самых затратных запросов важно для оптимизации производительности базы данных. Затратные запросы могут потреблять больше ресурсов, чем необходимо, что приводит к увеличению времени выполнения, нагрузке на сервер и замедлению работы системы. Существует несколько подходов и инструментов для выявления таких запросов.
Многие системы управления базами данных (СУБД) поддерживают логирование запросов, выполнение которых занимает больше определённого времени.
Используйте
slow_query_log. Активировать лог:SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- Время выполнения в секундах
Включите
log_min_duration_statement.SET log_min_duration_statement = 1000; -- Логировать запросы, выполняющиеся более 1 секунды
Эти команды дают подробный план выполнения запросов, показывая, как база данных интерпретирует их.
MySQL
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
PostgreSQL
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE status = 'pending';
Используйте таблицу
performance_schema для анализа запросов.SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
Используйте расширение
pg_stat_statements.CREATE EXTENSION pg_stat_statements;
Получите информацию
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
Проводит анализ SQL-запросов, показывая самые медленные.
Позволяет отслеживать производительность запросов в реальном времени.
Специализированный инструмент для анализа производительности баз данных.
SELECT * FROM sys.schema_unused_indexes;
Проверьте в плане выполнения запросов (
EXPLAIN), используются ли индексы.Используйте нагрузочные тесты, чтобы выявить запросы, создающие "бутылочные горлышки":
Симулирует многопоточную нагрузку на базу данных.
Анализирует производительность системы под высокой нагрузкой.
Включите трассировку (например, в MySQL —
SHOW PROFILE):SET profiling = 1;
SELECT * FROM orders WHERE status = 'pending';
SHOW PROFILE FOR QUERY 1;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4