15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
10.10.2024

SQLite vs MySQL: Архитектура, производительность и когда каждая из них действительно важна

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

Обе системы соответствуют требованиям ACID и поддерживают SQL, однако их внутренняя механика, модели блокировок, возможности репликации и поверхности атак принципиально различаются. Это руководство детально рассматривает каждый значимый аспект, чтобы вы могли сделать обоснованный, технически грамотный выбор.

Что такое SQLite?

SQLite — это открытый, автономный, бессерверный движок SQL-баз данных, поддерживаемый Д. Ричардом Хиппом и выпущенный в общественное достояние. Вся база данных — схема, таблицы, индексы и данные — хранится в едином кроссплатформенном файле .db на диске. Не нужно запускать демон, открывать порт или настраивать уровень аутентификации. Библиотека SQLite встраивается непосредственно в бинарный файл приложения, делая движок базы данных неотъемлемой частью самого процесса.

Такая архитектура делает SQLite наиболее широко развёрнутым движком баз данных в мире по количеству экземпляров. Он поставляется в каждом устройстве Android и iOS, в каждом браузере Chrome и Firefox, в каждой установке macOS и Windows, а также в бесчисленных образах встроенных прошивок.

Ключевые технические характеристики SQLite

  • Бессерверное выполнение: процесс приложения читает и записывает файл .db напрямую через файловый ввод-вывод на уровне ОС, минуя сетевой стек.
  • Модель с единственным писателем: SQLite использует блокировку на уровне базы данных. Только один писатель может удерживать блокировку записи одновременно; параллельные читатели разрешены во время транзакции чтения, но блокируются во время записи.
  • Динамическая система типов (сродство типов): типы столбцов носят рекомендательный характер и не применяются принудительно. Столбец, объявленный как INTEGER, без проблем сохранит текстовую строку. Это сделано намеренно, но может привести к незаметным проблемам с целостностью данных, если прикладной уровень не обеспечивает соблюдение типов.
  • Режим WAL (Write-Ahead Logging): включение режима WAL (PRAGMA journal_mode=WAL) значительно улучшает параллелизм чтения, позволяя читателям и единственному писателю работать одновременно, не блокируя друг друга.
  • Максимальный размер базы данных: теоретически до 281 ТБ, хотя практические ограничения определяются файловой системой и деградацией производительности при масштабировании.
  • Развёртывание без копирования: распространение или резервное копирование базы данных SQLite так же просто, как копирование одного файла.

Где SQLite является правильным инструментом

  • Мобильные приложения (iOS, Android): обе платформы предоставляют нативные привязки SQLite. Отсутствие сетевого обращения означает задержку запросов менее миллисекунды для локальных данных.
  • Встраиваемые устройства и IoT: ограниченные среды с небольшим объёмом RAM и без сетевого подключения идеально подходят для SQLite.
  • Настольные приложения: приложения Electron, локальные аналитические инструменты и программное обеспечение с поддержкой офлайн-режима выигрывают от модели SQLite без настройки.
  • Хранилище на стороне браузера: Web SQL API (ныне устаревший) был построен на SQLite; современные альтернативы, такие как wa-sqlite, переносят его в WebAssembly.
  • Автоматизированное тестирование и CI-конвейеры: замена производственной базы данных MySQL на экземпляр SQLite в памяти (:memory:) во время модульных тестов устраняет внешние зависимости и значительно ускоряет наборы тестов.
  • Хранилища конфигурации и кэша: приложения, которым нужна структурированная локальная персистентность без накладных расходов полноценной RDBMS — например, настройки приложения, локальные кэши или офлайн-очереди — являются естественными потребителями SQLite.

Что такое MySQL?

MySQL — это полноценная клиент-серверная RDBMS, первоначально разработанная MySQL AB, а ныне поддерживаемая корпорацией Oracle по двойной лицензии GPL/коммерческой. Приложения взаимодействуют с сервером MySQL (mysqld) по TCP/IP или через Unix-сокет, используя проводной протокол MySQL. Сервер управляет пулом соединений, разбором запросов, оптимизацией запросов, управлением транзакциями и диспетчеризацией движка хранения независимо от любого отдельного клиента.

Архитектура подключаемых движков хранения MySQL является одним из наиболее важных архитектурных решений. InnoDB (движок по умолчанию начиная с MySQL 5.5) обеспечивает полное соответствие ACID, блокировку на уровне строк, принудительное применение внешних ключей и MVCC (Multi-Version Concurrency Control). MyISAM, устаревший движок, обеспечивает более быстрое чтение для определённых рабочих нагрузок, но лишён транзакций и блокировки на уровне строк — его следует считать устаревшим для новых проектов.

Ключевые технические характеристики MySQL

  • Модель параллелизма MVCC: InnoDB использует MVCC, позволяя нескольким транзакциям читать согласованные снимки данных без блокировки писателей, и наоборот. Это основной механизм, обеспечивающий высокопроизводительные параллельные рабочие нагрузки.
  • Блокировка на уровне строк: конкуренция ограничена отдельными строками, а не всей таблицей или базой данных, что обеспечивает значительно большую параллельность записи по сравнению с блокировкой на уровне базы данных в SQLite.
  • Строгое применение типов: типы столбцов применяются принудительно на уровне хранения. Вставка строки в столбец INT вызывает ошибку (в строгом режиме SQL), защищая целостность данных на уровне базы данных.
  • Репликация: MySQL поддерживает асинхронную и полусинхронную репликацию через бинарный лог (binlog), групповую репликацию (multi-primary) и InnoDB Cluster для обеспечения высокой доступности.
  • Хранимые процедуры, триггеры и представления: MySQL поддерживает серверную программируемую логику, позволяя применять сложные бизнес-правила на уровне базы данных.
  • Полнотекстовый поиск: полнотекстовые индексы InnoDB поддерживают запросы в режиме естественного языка и булевом режиме нативно.
  • Управление пользователями и RBAC: детализированные разрешения GRANT/REVOKE на уровне базы данных, таблицы, столбца и процедуры в сочетании с аутентификацией клиента по SSL/TLS.

Где MySQL является правильным инструментом

  • Веб-приложения с параллельными пользователями: любое приложение, где несколько пользователей одновременно читают и записывают данные — WordPress, Magento, приложения Laravel — требует модели параллелизма MVCC MySQL.
  • Платформы электронной коммерции: целостность транзакций, ограничения внешних ключей и блокировка на уровне строк являются обязательными, когда речь идёт о деньгах и товарных запасах.
  • Многопользовательские SaaS-продукты: изоляция пользователей, управление доступом на основе ролей и возможность горизонтального масштабирования через реплики для чтения необходимы на уровне SaaS.
  • Хранилища данных и аналитика: хотя специализированные OLAP-системы (ClickHouse, Redshift) превосходят MySQL для аналитических рабочих нагрузок, MySQL эффективно справляется с отчётными запросами на наборах данных умеренного размера (сотни ГБ).
  • Производственные среды с высокой доступностью: InnoDB Cluster с MySQL Router обеспечивает автоматическое переключение при отказе, делая MySQL жизнеспособным выбором для приложений со строгими SLA по времени безотказной работы.

Если вы запускаете MySQL в производственной среде, базовая инфраструктура имеет такое же значение, как и конфигурация базы данных. Правильно настроенная среда VPS Хостинга с выделенным распределением CPU и RAM предотвращает конкуренцию за ресурсы, которая снижает производительность MySQL под нагрузкой.

Сравнение лицом к лицу: SQLite против MySQL

Архитектура и развёртывание

ФункцияSQLiteMySQL
АрхитектураВстраиваемая, бессервернаяКлиент-сервер
Требуется серверный процессНетДа (`mysqld`)
Сетевое взаимодействиеОтсутствует (файловый ввод-вывод)TCP/IP или Unix-сокет
Требуется настройкаНетТребуется настройка `my.cnf`
Формат хранения базы данныхЕдиный файл `.db`Несколько файлов (табличные пространства, redo-логи, binlog-и)
Сложность развёртыванияСкопировать файлУстановить, настроить, защитить, мониторить
Метод резервного копированияКопирование файла или `.dump``mysqldump`, `mysqlpump`, Percona XtraBackup

Параллелизм и производительность

ФункцияSQLiteMySQL (InnoDB)
Гранулярность блокировкиНа уровне базы данных (WAL улучшает параллелизм чтения)На уровне строк
Модель параллелизмаЕдинственный писатель, множество читателейMVCC (несколько параллельных читателей и писателей)
Пропускная способность параллельной записиНизкая (последовательные записи)Высокая (блокировка на уровне строк + MVCC)
Производительность чтения (один пользователь)Отличная (без сетевых накладных расходов)Очень хорошая (незначительные накладные расходы сети/сокета)
Пул соединенийНе применимоОбязателен (используйте ProxySQL или встроенный пул потоков)
Подходящий размер набора данныхДо нескольких ГБ на практикеТерабайты (при правильной индексации и оборудовании)

Типы данных и целостность

ФункцияSQLiteMySQL
Система типовДинамическая (сродство типов)Статическая, строго применяемая
Применение внешних ключейОпционально (`PRAGMA foreign_keys=ON`)Применяется InnoDB по умолчанию
Ограничения CHECKПоддерживаются (анализируются, но исторически не применялись; применяются начиная с SQLite 3.25.0)Поддерживаются и применяются
Поддержка JSONРасширение `JSON1`Нативный тип данных `JSON` с функциями пути
Соответствие ACIDДаДа (InnoDB)
Строгий режим`PRAGMA strict` (SQLite 3.37+)`sql_mode=STRICT_TRANS_TABLES`

Функции и возможности

ФункцияSQLiteMySQL
Хранимые процедурыНетДа
ТриггерыДа (ограниченные)Да (полные)
ПредставленияДаДа
Полнотекстовый поискБазовый (расширение FTS5)Нативный InnoDB FTS
РепликацияНетАсинхронная, полусинхронная, групповая репликация
ПартиционированиеНетДа (RANGE, LIST, HASH, KEY)
Управление пользователямиНет (только разрешения файловой системы ОС)Полный RBAC с `GRANT`/`REVOKE`
КластеризацияНетInnoDB Cluster, Galera Cluster

Безопасность

ФункцияSQLiteMySQL
АутентификацияОтсутствует (разрешения файловой системы ОС)Имя пользователя/пароль, на основе плагинов, SSL-сертификаты клиента
Шифрование в состоянии покояЧерез расширение SQLCipher или шифрование на уровне ОСШифрование табличного пространства InnoDB (AES-256)
Шифрование при передачеНе применимо (нет сети)SSL/TLS применяется для каждого соединения
Журналирование аудитаНетПлагин Enterprise Audit; открытый исходный код через `general_log`
Поверхность сетевых атакНулеваяТребует правил брандмауэра и усиления `bind-address`

Важное операционное замечание: сетевая доступность MySQL означает, что неправильно настроенный bind-address = 0.0.0.0 со слабым паролем root является распространённым вектором атаки. Всегда привязывайте MySQL к 127.0.0.1 или частному интерфейсу, применяйте SSL/TLS для удалённых соединений и используйте действительный SSL Сертификат для любого веб-уровня приложения.

Простота использования и операционные накладные расходы

ФункцияSQLiteMySQL
Время начальной настройкиСекунды15–60 минут (установка, защита, настройка)
Текущее администрированиеМинимальноеЗначительное (мониторинг, резервное копирование, задержка репликации)
Порог вхожденияНизкийСредний или высокий
Экосистема инструментовDB Browser for SQLite, DBeaverMySQL Workbench, DBeaver, phpMyAdmin, Percona Toolkit
Подходит для начинающихДаТребует более глубоких знаний

Углублённый анализ производительности: где каждый движок действительно выигрывает

Преимущества производительности SQLite

Преимущество SQLite в производительности в однопользовательских или низкопараллельных сценариях обусловлено полным устранением сетевого стека. Локальный запрос SQLite выполняется за микросекунды; эквивалентный запрос MySQL несёт накладные расходы сокета, амортизацию установления соединения и разбор запроса на сервере — и всё это до того, как движок хранения обработает хотя бы один байт.

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

Режим WAL является обязательным для любого серьёзного развёртывания SQLite. Без WAL каждая запись получает эксклюзивную блокировку, которая блокирует всех читателей. При включённом WAL:

sqlite3 mydb.db "PRAGMA journal_mode=WAL;"

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

Преимущества производительности MySQL

Движок InnoDB MySQL разработан для параллельных смешанных рабочих нагрузок чтения-записи. Реализация MVCC означает, что длительная операция SELECT не блокирует операции INSERT или UPDATE на тех же строках — каждая транзакция видит согласованный снимок данных на момент своего начала.

Критические параметры настройки InnoDB, которые должен знать каждый администратор MySQL:

# /etc/mysql/mysql.conf.d/mysqld.cnf
innodb_buffer_pool_size = 70%_of_RAM   # Most important single parameter
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1     # Full ACID; set to 2 for performance at slight durability risk
innodb_flush_method = O_DIRECT
max_connections = 200                   # Tune based on workload; pair with connection pooling

Параметр innodb_buffer_pool_size один отвечает за большую часть настройки производительности MySQL. Установка его на уровне 70–80% доступной RAM на выделенном сервере базы данных значительно снижает дисковый ввод-вывод, сохраняя горячие страницы данных в памяти.

Для производственных развёртываний MySQL Выделенный Сервер с предсказуемыми, неразделяемыми ресурсами устраняет проблему «шумного соседа», которая снижает эффективность innodb_buffer_pool на общей инфраструктуре.

Критические пограничные случаи и распространённые ловушки

Ловушки SQLite, которые застают инженеров врасплох

1. Ловушка параллелизма «работает на моей машине». Модель единственного писателя SQLite незаметна во время разработки, когда только один разработчик пишет в базу данных. В производстве даже умеренный параллелизм — два фоновых задания, пишущих одновременно — приводит к ошибкам SQLITE_BUSY. Приложения должны реализовывать логику повторных попыток с экспоненциальной задержкой:

import sqlite3
import time

def execute_with_retry(conn, query, params=(), retries=5, delay=0.1):
    for attempt in range(retries):
        try:
            conn.execute(query, params)
            conn.commit()
            return
        except sqlite3.OperationalError as e:
            if "database is locked" in str(e) and attempt < retries - 1:
                time.sleep(delay * (2 ** attempt))
            else:
                raise

2. Внешние ключи отключены по умолчанию. Каждое новое соединение SQLite начинается с отключённым применением внешних ключей. Вы должны явно включить его для каждого соединения:

conn.execute("PRAGMA foreign_keys = ON")

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

3. Неожиданности сродства типов. Вставка "2024-01-15" в столбец, объявленный как DATE, сохраняет его как текст, а не как дату. SQLite не имеет нативного типа DATE или DATETIME — он хранит даты как текст, вещественные числа (юлианский день) или целые числа (временная метка Unix). Приложения должны последовательно применять соглашения об обработке дат.

4. Режим общего кэша не является решением для параллелизма. Некоторые разработчики включают режим общего кэша в надежде улучшить многопоточную производительность. На практике это вводит незаметные ошибки блокировки и явно не рекомендуется документацией SQLite для большинства случаев использования.

Ловушки MySQL, которые проявляются в производстве

1. SELECT * на больших таблицах без LIMIT. Оптимизатор запросов MySQL не всегда может предотвратить полное сканирование таблицы, когда запросу не хватает покрытия индексом. Всегда выполняйте EXPLAIN запросов перед развёртыванием:

EXPLAIN SELECT * FROM orders WHERE customer_email = 'user@example.com';

Значение type: ALL в выводе означает полное сканирование таблицы — добавьте индекс.

2. Неявные коммиты внутри транзакций. DDL-операторы (ALTER TABLE, CREATE INDEX, DROP TABLE) выполняют неявный COMMIT в MySQL, молча завершая любую открытую транзакцию. Это частый источник ошибок частичной миграции.

3. Задержка репликации при интенсивных записях. Асинхронная репликация MySQL по умолчанию означает, что реплики могут отставать от первичного узла при устойчивом давлении записи. Приложения, читающие из реплик сразу после записи, могут получить устаревшие данные. Используйте полусинхронную репликацию или реализуйте маршрутизацию «читай свои записи» на уровне приложения.

4. Исчерпание max_connections. Значение max_connections = 151 по умолчанию опасно мало для любого приложения с неправильно настроенным пулом соединений. Исчерпание соединений приводит к ошибкам Too many connections, которые выводят приложение из строя. Всегда развёртывайте пул соединений (ProxySQL, MySQL-форк PgBouncer) перед MySQL в производстве.

5. Несоответствие сопоставлений наборов символов. Объединение таблиц с разными сопоставлениями (utf8mb4_unicode_ci против utf8mb4_general_ci) принудительно выполняет полное сканирование таблицы, отключая использование индекса. Стандартизируйте на utf8mb4 с utf8mb4_unicode_ci для всех таблиц и соединений.

Шаблоны архитектуры развёртывания

SQLite в веб-приложении: когда это работает

SQLite подходит для веб-приложения при определённых, хорошо понятных условиях:

  • Развёртывание на одном сервере с низким параллелизмом записи: личный блог, сайт документации с интенсивным чтением или внутренний инструмент с менее чем 10 одновременными пользователями.
  • Реплики для чтения через репликацию файлов: Litestream (инструмент репликации SQLite на Go) передаёт WAL-фреймы в S3-совместимое объектное хранилище практически в реальном времени, обеспечивая аварийное восстановление без сервера MySQL.
  • Граничные вычисления: Cloudflare D1 и Turso — это распределённые продукты SQLite, которые переносят модель программирования SQLite на глобально распределённые граничные узлы — поистине новаторская архитектура, которую клиент-серверная модель MySQL не может воспроизвести.

MySQL в масштабируемом веб-стеке

Производственное развёртывание MySQL для высоконагруженного веб-приложения обычно следует этому шаблону:

  • Первичный (записывающий) узел: обрабатывает все операции INSERT, UPDATE, DELETE. Работает на выделенном оборудовании с NVMe-хранилищем.
  • Реплики для чтения (1–N): обрабатывают запросы SELECT. Разделение чтения/записи на уровне приложения (через ProxySQL или логику приложения) маршрутизирует запросы соответствующим образом.
  • Пул соединений: ProxySQL располагается между приложением и MySQL, управляя мультиплексированием соединений и маршрутизацией запросов.
  • Мониторинг: pt-query-digest (Percona Toolkit) анализирует логи медленных запросов; Prometheus с mysqld_exporter обеспечивает метрики в реальном времени.

Для команд, развёртывающих веб-приложения на основе MySQL, VPS с cPanel предоставляет управляемую среду со встроенными инструментами администрирования баз данных, снижая операционную нагрузку по сравнению с управлением чистым сервером. Для приложений, которым необходим полный контроль над конфигурацией MySQL — настройка my.cnf под конкретные нужды, специфические параметры движка хранения или настройка InnoDB Cluster — VPS с полным root-доступом является подходящей отправной точкой.

Матрица решений: SQLite или MySQL?

Используйте эту матрицу для принятия обоснованного архитектурного решения:

КритерийВыбрать SQLiteВыбрать MySQL
Параллельные писатели1 (или близко к нулю)2 или более
Модель развёртыванияВстраиваемая / однопроцесснаяКлиент-сервер / многопроцессная
Аутентификация пользователейНе требуетсяТребуется
Размер набора данныхДо 1 ГБ комфортно; до ~10 ГБ с осторожностьюОт гигабайт до терабайт
Требуется репликация / HAНетДа
Хранимые процедуры / триггерыНе нужныНужны
Сетевой доступ к БДНе требуетсяТребуется
Доступна операционная командаНет (разработчик-одиночка)Да (DBA или DevOps)
Среда тестирования / CIИдеально (`:memory:` в памяти)Возможно, но тяжелее
Граничное / встраиваемое развёртываниеДаНет

Практические ключевые выводы

  • Включайте режим WAL для каждой базы данных SQLite, которая будет получать какой-либо параллельный доступ. Это единственное изменение конфигурации с наибольшим эффектом.
  • Никогда не открывайте SQLite в сеть. Если ваша архитектура требует сетевого доступа к базе данных, вы уже переросли SQLite — переходите на MySQL.
  • Устанавливайте PRAGMA foreign_keys = ON при каждом открытии соединения SQLite, а не только один раз при создании базы данных.
  • Настраивайте innodb_buffer_pool_size как первый шаг оптимизации MySQL. Выделяйте 70–80% RAM сервера на выделенном хосте базы данных.
  • Используйте EXPLAIN перед развёртыванием любого нетривиального запроса MySQL. Отсутствующий индекс на таблице с миллионами строк — это производственный инцидент, ожидающий своего часа.
  • Реализуйте пул соединений (ProxySQL или аналог) до того, как MySQL достигнет 50 параллельных соединений. Добавлять его позже под нагрузкой болезненно.
  • Не используйте MyISAM для новых таблиц MySQL. InnoDB строго превосходит его практически для любой рабочей нагрузки и является движком по умолчанию уже более десяти лет.
  • Для SQLite в производственных веб-приложениях оцените Litestream для непрерывной репликации в объектное хранилище — это устраняет возражение «единая точка отказа» без добавления операционной сложности MySQL.
  • Подбирайте инфраструктуру под движок базы данных. SQLite на общем хостинге подходит для сайтов с низким трафиком. MySQL в масштабе требует выделенных ресурсов — CPU, RAM и быстрого NVMe I/O — которые обеспечивает правильно подготовленный Выделенный Сервер.

Часто задаваемые вопросы

Может ли SQLite обслуживать производственное веб-приложение?

Да, при определённых условиях: развёртывание на одном сервере, низкий объём параллельных записей (менее ~10 одновременных писателей) и наборы данных размером несколько гигабайт. Высоконагруженные приложения с несколькими серверами приложений не могут совместно использовать один файл SQLite по сети — модель блокировки файлов ломается при распределённом доступе. Для таких сценариев MySQL является правильным выбором.

Соответствует ли SQLite требованиям ACID так же, как MySQL?

Обе системы полностью соответствуют требованиям ACID. SQLite обеспечивает атомарность и долговечность через WAL или журнал отката. Движок InnoDB MySQL использует redo-логи и MVCC. Практическое различие состоит в том, что блокировка на уровне строк MySQL позволяет поддерживать гарантии ACID для множества одновременных транзакций, тогда как SQLite сериализует записи.

Можно ли позже перейти с SQLite на MySQL?

Да, но это требует тщательной обработки. Динамическая система типов SQLite и отсутствие строгого применения типов означают, что данные, экспортированные через .dump, могут содержать несоответствия типов, которые строгий режим MySQL отклонит. Обычно требуются такие инструменты, как pgloader (с выводом MySQL) или пользовательские ETL-скрипты. Планируйте миграцию до того, как объём данных сделает её операционно болезненной.

Требует ли MySQL выделенного сервера?

Не обязательно, но среды общего хостинга накладывают ограничения на соединения, ограничения RAM и ограниченный доступ к my.cnf, что препятствует правильной настройке MySQL. Для любого приложения, где важна производительность базы данных, настоятельно рекомендуется VPS или выделенный сервер с root-доступом к конфигурации MySQL. Панели управления VPS могут упростить управление MySQL без ущерба для гибкости конфигурации.

В чём разница в производительности между SQLite и MySQL для одного пользователя, читающего локальные данные?

SQLite быстрее для однопользовательского локального чтения, поскольку устраняет все сетевые накладные расходы, установление соединения и межпроцессное взаимодействие. Простой запрос SELECT к индексированной таблице SQLite может возвращать результаты менее чем за 100 микросекунд. Эквивалентный запрос MySQL через локальный Unix-сокет обычно занимает 300–800 микросекунд — всё ещё быстро, но заметно медленнее из-за накладных расходов протокола клиент-сервер.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать