Вопрос по mysql, database – Как MySQL хранит данные

20

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

Возможно, вы захотите взглянуть на разные движки баз данных, которые он использует. Некоторые хранят данные в «большом файле», а другие находятся в памяти. Для скорости доступа он использует столбцы и строки фиксированного размера, поэтому получить доступ к определенной записи легче, чем сканировать весь текст. Он также может хранить индексы данных, чтобы сделать поиск еще быстрее. Движок по умолчанию и наиболее часто используемый - это мой isam. Другие включают inno-db и MEMORY. gcochard
@ Cez, значит, структура данных не постоянна? Где-то как-то данные или метаданные все это сидит на диске. Вы можете сохранить данные для временной таблицы в файле, а затем загрузить таблицу mem с данными во время запуска. Namphibian
@ Грег, но даже таблица памяти хранится где-то, чтобы обеспечить постоянство. Суть в том, что он хранится где-то на диске. Namphibian
@ Данные Namphibian в таблицах памяти не постоянны, только структура Cez

Ваш Ответ

4   ответа
17

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

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

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

Прежде всего, СУБД не только о производительности:

Они даже больше о Безопасность ваших данных - они должны обеспечить отсутствие повреждения данных даже при отключении питания или сбое в сети.1DBMS также о Параллелизм - им приходится осуществлять арбитраж между несколькими клиентами, которые обращаются к одним и тем же данным и могут изменять их.2

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

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

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

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

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

14

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

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" в моей системе.

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

The.frmайл @ table хранит формат таблицы. Детали: MySQL .FRM Формат файла

The.ibd file хранит данные таблицы. Детали:InnoDB Табличные пространства файлов на таблицы

Вот и все! Надеюсь, я кому-то помог.

Если бы только был способ контроля над этими файлами user4757074
@ user4757074 Вы можете превратить любой каталог в локальный репозиторий Git с помощьюgit init… Но зачем вам нужен контроль над этими файлами? Rory O'Kane
3

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

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

Хотя безопасность и параллелизм важны, это не ПОЧЕМУ базы данных, а дополнительные функции. Самые первые базы данныхсуществуе потому что невозможно получить произвольный доступ к последовательному файлу, содержащему данные переменной длины.

На самом деле, самые первые базы данных существовали для того, чтобы облегчить обмен данными между приложениями, которые обычно создавались и поддерживались отдельными командами программистов. Walter Mitty
2

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

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

Похожие вопросы