Вопросы по структуре файлов данных MyISAM
25 августа 2008, 23:34
Автор: 1234ru
Коллеги,
Читал о структуре файлов данных MyISAM. По ссылке
http://forge.mysql.com/wiki/MySQL_Internals_MyISAM#MyISAM_Record_Structure
написано:
Возникло несколько вопросов:
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.
3.1. Как я понимаю, первый байт - F1 - это заголовок строки. Как сказано выше, в двоичной системе это 1110101.
Исходя из вышеописанных правил, заголовок первой строки должен быть такой:
первый бит = 1 , т.к. строка не удалена
второй бит = 0, т.к. строка не содержит NULL'ов
третий - восьмой биты = 1
в результате имеем 10111111
Почему не так?
3.2. F5 - это заголовок уже второй строки. Не касаясь того, почему это именно такое число (это, видимо, выяснится при обсуждении предыдущего подпункта), замечу, что байты, стоящие между F1 и F5, относятся к данным - соответственно, трём колонкам таблицы - column1, column2, column3. Каждая из них имеет тип
Почему биты считают справа, а не слева - "the third flag bit from the right is on"?
Читал о структуре файлов данных 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
"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.
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"?