webew
Войти » Регистрация
 
MySQL/MariaDB

Вопросы по структуре файлов данных MyISAM

25 августа 2008, 23:34
Автор: 1234ru
Коллеги,

Читал о структуре файлов данных MyISAM. По ссылке
http://forge.mysql.com/wiki/MySQL_Internals_MyISAM#MyISAM_Record_Structure

написано:
Цитата:
The minimal record header is a set of flags:
"X bit" = 0 if row is deleted, = 1 if row is not deleted
"Null Bits" = 1 if row contains any null fields, or = 0 otherwise.
"Filler Bits" = 1

The length of the record header is thus:
(1 + number of NULL columns + 7) / 8 bytes


Возникло несколько вопросов:

1. Зачем хранить информацию об удаленных строках?

2. Рассмотрим выражение (1 + number of NULL columns + 7)

2.1. Почему написано "Null Bits" = 1 if row contains any null fields, or = 0 otherwise", т.е. просто флаг длиной один бит, тогда как далее в формуле написано "number of NULL columns".
Как все-таки хранится информация о NULL-содержащих колонках, просто как флаг о наличии/отсутсвии NULL'ов в строке или детально по каждой колонке?

2.2. Откуда число '7'?


3.
Цитата:
CREATE TABLE Table1 (column1 CHAR(1), column2 CHAR(1), column3 CHAR(1));
INSERT INTO Table1 VALUES ('a', 'b', 'c');
INSERT INTO Table1 VALUES ('d', NULL, 'e');

...

Hexadecimal Display of Table1.MYD file
F1 61 62 63 00 F5 64 20 65 00 ... .abc..d e.

- The hexadecimal numbers F1 61 62 63 00 F5 64 20 65 00 are byte values and the column on the - right is an attempt to show the same bytes in ASCII.
- The F1 byte means that there are no null fields in the first row.
- The F5 byte means that the second column of the second row is NULL.



3.1. Как я понимаю, первый байт - F1 - это заголовок строки. Как сказано выше, в двоичной системе это 1110101.
Исходя из вышеописанных правил, заголовок первой строки должен быть такой:

первый бит = 1 , т.к. строка не удалена
второй бит = 0, т.к. строка не содержит NULL'ов
третий - восьмой биты = 1

в результате имеем 10111111

Почему не так?

3.2. F5 - это заголовок уже второй строки. Не касаясь того, почему это именно такое число (это, видимо, выяснится при обсуждении предыдущего подпункта), замечу, что байты, стоящие между F1 и F5, относятся к данным - соответственно, трём колонкам таблицы - column1, column2, column3. Каждая из них имеет тип

Цитата:
(It's probably easier to understand the flag setting if you restate F5 as 11110101 binary, and (a) notice that the third flag bit from the right is on, and (b) remember that the first flag bit is the X bit.)


Почему биты считают справа, а не слева - "the third flag bit from the right is on"?
Добавить комментарий
NO USERPIC

rgbeast

Биты нумеруются обычно справа, 1 - младший. В данном случае, так договорились.

Далее все объясняется
F1 = 111110001 (в двоичном виде)
в обратном порядке 100011111
1 - строка не удалена
0, 0. 0 - все три NULL-колонки не NULL (очевидно, что по биту для каждой колонки, которая может быть NULL)
1111 - заполнение единицами до целого числа байт, (x + 7) / 8 это округление до целого числа байт, так как деление здесь целочисленное

F5 = 11110101
в обратном порядке
1010111
1 - строка не удалена
010 - вторая из NULL-колонок содержит NULL
1111 - заполнение до целого числа байт

Если строка удаляется, то часто не имеет смысла сдвигать весь файл, поэтому она просто помечяется удаленной, а потом при вставке на ее место попадает новая. Чтобы избавиться от всех интервалов ALTER TABLE таблица ENGINE=MyISAM;
26.08.2008, 12:58
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100