List:Internals« Previous MessageNext Message »
From:Sergei Golubchik Date:November 27 2006 3:14pm
Subject:Re: erratum in the "MySQL Internals Manual"
View as plain text  
Hi!

First: I'll forward this reply to our documentation team, they'll fix
the manual.

On Nov 23, David Lee Lambert wrote:
> Section 11.1.1. ("Introduction",  
> http://dev.mysql.com/doc/internals/en/myisam-introduction.html ) uses the 
> following example for a MyISAM dynamic row:
> 
> 03, 00             start of header
> 04                 actual length
> 0c                 unused length
> 01, fc             flags + overflow pointer
> ****               data in the row
> ************       unused bytes
>                    <-- next row starts here)
> 
> However,  the "start of header" is actually only the first byte, 03.  That 
> means that the next two bytes represent the actual length,  and the next byte 
> after that is the unused length.  

Correct. Though it's "block length", not "unused length"
 
> The notation "flags+overflow pointer" is also confusing.  If an overflow 
> pointer were present (only in blocks of type 05,06,0b,0c, or 0d),  it would 
> come before the flags,  as the last 8 bytes of the header.  There is no flag 
> for the overflow byte.

I don't see any "flags" at all in the dynamic row header.
Overflow pointer is in the last 8 bytes of the header, and only in
blocks 05,06,0b,0c,0d, you're right.

There's no overflow pointer in the block type 03, that is used in the
manual as an example.
 
> Finally,  it isn't stated anywhere that there is no "deleted bit" in a dynamic 
> row.  Thus,  8 nullable columns will only take one flag byte,  where they 
> would require 2 bytes in a static table.  Deletions are instead marked with a 
> block of type 0.

Right.
 
> One question I still have:  does "CREATE TABLE ( ... ) AVG_ROW_LENGTH=xxx"  
> actually do anything for MyISAM dynamic-row tables under MySQL 5?  No matter 
> what settings I use,  the minimum per-row size is 20 bytes,  rows are aligned 
> on 4-byte boundaries,  and overflow pointers are 8 bytes long.

Not directly. AVG_ROW_LENGTH*MAX_ROWS is used as an estimate for a data
file length. Compare

create table t1 (a text) max_rows=10000 AVG_ROW_LENGTH=10;
create table t2 (a text) max_rows=10000 AVG_ROW_LENGTH=100000;

Regards,
Sergei

-- 
   __  ___     ___ ____  __
  /  |/  /_ __/ __/ __ \/ /   Sergei Golubchik <serg@stripped>
 / /|_/ / // /\ \/ /_/ / /__  MySQL AB, Senior Software Developer
/_/  /_/\_, /___/\___\_\___/  Kerpen, Germany
       <___/  www.mysql.com
Thread
erratum in the "MySQL Internals Manual"David Lee Lambert23 Nov
  • Re: erratum in the "MySQL Internals Manual"Sergei Golubchik27 Nov
  • Re: erratum in the "MySQL Internals Manual"Ingo Strüwing8 Dec