Подтвердить что ты не робот

Как MySQL хранит данные

Я оглянулся вокруг Гуля, но не нашел хорошего ответа. Хранит ли он данные в одном большом файле? Какие методы он использует, чтобы сделать доступ к данным быстрее, чем просто чтение и запись в обычный файл?

4b9b3361

Ответ 1

Сохраняет ли он данные в одном большом файле?

Некоторые СУБД хранят всю базу данных в одном файле, некоторые разделенные таблицы, индексы и другие типы объектов для разделения файлов, некоторые разделенные файлы не по типу объекта, а по некоторым критериям хранения/размера, некоторые могут даже полностью обходит файловую систему и т.д. и т.д.

Я не знаю, какую из этих стратегий использует MySQL (вероятно, это зависит от того, используете ли вы MyISAM против InnoDB и т.д.), но, к счастью, это не имеет значения: с точки зрения клиента это реализация СУБД детали, о которых клиент должен редко беспокоиться.

Какие методы он использует, чтобы сделать доступ к данным быстрее, чем просто чтение и запись в обычный файл?

Прежде всего, DBMses - это не просто производительность:

  • Они даже больше о безопасности ваших данных - они должны гарантировать, что нет повреждения данных даже перед отключением питания или сбоем сети. 1
  • СУБД также относятся к concurrency - они должны создавать арбитр между несколькими клиентами, получающими доступ, и потенциально модифицировать одни и те же данные. 2

Что касается вашего конкретного вопроса о производительности, реляционные данные очень "восприимчивы" к индексированию и кластеризации, которые широко используются СУБД для достижения производительности. Кроме того, основанный на наборах характер SQL позволяет СУБД выбирать оптимальный способ получения данных (теоретически, по крайней мере, некоторые СУБД лучше, чем другие). Для получения дополнительной информации о производительности СУБД я настоятельно рекомендую: Использовать Индекс, Люк!

Кроме того, вы, вероятно, заметили, что большинство СУБД являются довольно старыми продуктами. Подобно десятилетиям, которые действительно являются эонами в наших отраслевых условиях. Одним из следствий этого является то, что у людей было достаточно времени, чтобы оптимизировать вывод из базы кода СУБД.

Теоретически вы могли бы достичь всего этого через файлы, но я подозреваю, что вы закончите что-то, что выглядит ужасно близко к СУБД (даже если у вас есть время и ресурсы, чтобы на самом деле это сделать). Итак, зачем изобретать колесо (если вы не хотите, чтобы колесо было на первом месте;))?


1 Обычно существует какой-то механизм журналирования или журнала транзакций. Кроме того, для минимизации вероятности "логического" искажения (из-за ошибок приложений) и содействия повторному использованию кода большинство СУБД поддерживают декларативные ограничения (домен, ключ и ссылочный), триггеры и хранимые процедуры.

2 изолировать транзакции и даже позволяя клиентам явно блокировать определенные части базы данных.

Ответ 2

Этот вопрос немного устарел, но я все равно решил ответить на него, так как я занимался тем же. Мой ответ основан на файловой системе Linux. В основном mySQL хранит данные в файлах на вашем жестком диске. Он хранит файлы в определенном каталоге, который имеет системную переменную "datadir". Открыв консоль mysql и выполнив следующую команду, вы узнаете, где именно находится папка.

mysql>  SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)

Как видно из приведенной выше команды, мой "datadir" находился в /var/lib/mysql/. Расположение "датадира" может различаться в разных системах. Каталог содержит папки и некоторые файлы конфигурации. Каждая папка представляет собой базу данных mysql и содержит файлы с данными для этой конкретной базы данных. ниже приведен скриншот каталога "datadir" в моей системе.

sample "datadir" directory screenshot

Каждая папка в каталоге представляет базу данных MySQL. Каждая папка базы данных содержит файлы, которые представляют таблицы в этой базе данных. Для каждой таблицы есть два файла: один с расширением .frm а другой с расширением .idb. Смотрите скриншот ниже.

sample MySQL database table screenshot

.frm таблицы .frm хранит формат таблицы. Смотрите здесь для подробной информации: MySQL.FRM формат файла

Файл .ibd хранит данные таблицы. Подробную информацию смотрите здесь: Табличные пространства InnoDB File-Per-Table

Вот и все, ребята! Я надеюсь, что я кому-то помог.

Ответ 3

Когда вы храните данные в плоском файле, он компактен и эффективен для чтения последовательно, но нет быстрого доступа к нему случайным образом. Это особенно верно для данных переменной длины, таких как документы, имена или строки. Чтобы обеспечить быстрый случайный доступ, большинство баз данных хранят информацию в одном файле с использованием структуры данных, называемой B-Tree. Эта структура позволяет быстро вставлять, удалять и искать, но она может использовать на 50% больше места, чем исходный файл. Однако, как правило, это не проблема, поскольку дисковое пространство дешево и больше, в то время как для основных задач обычно требуется быстрый доступ. Чтобы получить больше информации: http://en.wikipedia.org/wiki/B-tree

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

Хотя безопасность и concurrency важны, это не базы данных WHY, а добавленные функции. Самые первые базы данных существуют, потому что невозможно случайным образом получить доступ к последовательному файлу, содержащему данные переменной длины.

Ответ 4

Технически все это "файл", включая папки. весь ваш жесткий диск - гигантский файл. Сказав это, да реляционные базы данных, MySQL включил данные хранилища в файл данных на жестком диске. Разница между базой данных и записью/чтением в файл - это яблоки и апельсины. Базы данных обеспечивают структурированный способ хранения и поиска/извлечения данных таким образом, что вы никогда не сможете реплицироваться, просто прочитав и записывая файл. Если вы не написали свой собственный db, конечно.

надеюсь, что это поможет.