2012-04-30 4 views
18

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

+2

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

+0

@Greg, но даже таблица памяти хранится где-то, чтобы обеспечить постоянство. Суть в том, что он хранится где-то на диске. – Namphibian

+0

@ Данные в амфибии в таблицах памяти не являются постоянными, только структура – Cez

ответ

15

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

Некоторые DBMSes хранить всю базу данных в одном файле, некоторые разделенные таблицы, индексы и другие объектные типы в отдельные файлы, некоторые разделять файлы не объект вида, но по некоторым критериям хранения/размера, некоторые могут даже entirely bypass the file system, и т. д. и т. д. ...

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

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

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

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

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

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

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


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

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

1

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

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

3

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

Глядя внимательно в документации MySQL, мы находим, что индексы могут быть дополнительно установлен на или типа «ВТКЕЕ» «хэширования». Внутри одного файла MySQL хранятся несколько индексов, которые могут использовать либо структуру данных.

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

3

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

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

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

sample "datadir" directory screnshot

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

sample mysql database table screenshot

хранит файл .frm таблиц формата таблицы. подробнее читайте здесь MySQL .frm File Format

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

Thats it people! Надеюсь, я помог кому-то.