maria-developers team mailing list archive
Mailing list archive
Re: MDEV-7049 MySQL#74585 - InnoDB: Failing assertion: *mbmaxlen < 5 in file ha_innodb.cc line 1904
The purpose of this bit arithmetics (one could say CPU athletics) is to
reduce the size of the InnoDB data dictionary cache. If we look at dtype_t
and dict_col_t, these are not exactly at any byte boundary at the moment
(61 and 84 bits, respectively).
I would simply replace the mbminmaxlen field with two 3-bit fields
mbminlen, mbmaxlen. This would use up one more bit and would be faster to
extract (no multiplication or division, just simple bit-shifting and
masking). Also the code would be simpler, because a number of macros would
be removed. I think that a similar patch was done in MySQL, but apparently
it was never merged to the main trees.
On Thu, May 4, 2017 at 1:34 PM, Alexander Barkov <bar@xxxxxxxxxxx> wrote:
> Hello Marko,
> InnoDB uses 5 bits to store the combination of mbminlen and mbmaxlen,
> and its calculated as:
> mbmaxlen * 5 + mbminlen
> Note, combinations with mbminlen=0 and mbmaxlen=0 are not possible.
> Also, combinations with mbminlen>mbmaxlen are not possible.
> This is a summary:
> mbmaxlen 0 1 2 3 4
> 0 (0) (1) (2) (3) (4)
> 1 (5) 6 (7) (8) (9)
> 2 (10) 11 12 (13) (14)
> 3 (15) 16 17 18 (19)
> 4 (20) 21 22 23 24
> I marked impossible numbers with parentheses.
> In the range 0..24:
> - 10 pairs are valid
> - 15 pairs are not valid
> It should be safe to use any impossible number to mean
> mbmaxlen=5 & mbminlen=1
> It seems there is no really a need to extend the header to use
> separate 3 bits for both mbminlen and mbmaxlen.
Marko Mäkelä, Lead Developer InnoDB