Historically, InnoDB has inserted newly read blocks into the
middle of the list representing the buffer cache, to avoid
pollution of the cache due to excessive read-ahead. The idea is
that the read-ahead algorithm should not pollute the buffer cache
by forcing the frequently accessed (“hot”) pages out
of the LRU list. To achieve this, InnoDB internally maintains a
pointer at 3/8
from the tail of the LRU list,
and all newly read pages are inserted at this location in the LRU
list. The pages are moved to the from of the list (the
most-recently used end) when they are accessed from the buffer
cache for the first time. Thus pages that are never accessed never
make it to the front 5/8
of the LRU list.
The above arrangement logically divides the LRU list into two segments where the 3/8 pages downstream of the insertion point are considered “old” and are desirable victims for LRU eviction. Starting with InnoDB storage engine 1.0.5, this mechanism has been extended in two ways.
You can control the insertion point in the LRU list. A new
configuration parameter innodb_old_blocks_pct
now controls the
percentage of “old” blocks in the LRU list. The
default value of innodb_old_blocks_pct
is 37
,
corresponding to the original fixed ratio of 3/8. The permissible
value range is 5 to 95
.
The optimization that keeps the buffer cache from being churned
too much by read-ahead, is extended to avoid similar problems
resulting from table or index scans. During an index scan, a data
page is typically accessed a few times in quick succession and is
then never touched again. InnoDB storage engine 1.0.5 introduces a new
configuration parameter innodb_old_blocks_time
which specifies
the time window (in milliseconds) after the first access to a page
during which it can be accessed without being moved to the front
(most-recently used end) of the LRU list. The default value of
innodb_old_blocks_time
is 0
, corresponding to
the original behavior of moving a page to the MRU end of the LRU
list on first access in the buffer pool.
Both the new parameters innodb_old_blocks_pct
and
innodb_old_blocks_time
are dynamic, global and can be specified
in the MySQL option file (my.cnf
or
my.ini
) or changed at runtime with the
SET GLOBAL
command. Changing the setting
requires the SUPER
privilege.
To help you gauge the effect of setting these parameters, some
additional statistics are reported by SHOW ENGINE INNODB
STATUS
command. The BUFFER POOL AND
MEMORY
section now looks like:
Total memory allocated 1107296256; in additional pool allocated 0 Dictionary memory allocated 80360 Buffer pool size 65535 Free buffers 0 Database pages 63920 Old database pages 23600 Modified db pages 34969 Pending reads 32 Pending writes: LRU 0, flush list 0, single page 0 Pages made young 414946, not young 2930673 1274.75 youngs/s, 16521.90 non-youngs/s Pages read 486005, created 3178, written 160585 2132.37 reads/s, 3.40 creates/s, 323.74 writes/s Buffer pool hit rate 950 / 1000, young-making rate 30 / 1000 not 392 / 1000 Pages read ahead 1510.10/s, evicted without access 0.00/s LRU len: 63920, unzip_LRU len: 0 I/O sum[43690]:cur[221], unzip sum[0]:cur[0]
Old database pages
is the number of pages
in the “old” segment of the LRU list.
Pages made young
and not
young
is the total number of “old”
pages that have been made young or not respectively.
youngs/s
and non-young/s
is the rate at which page accesses to the “old”
pages have resulted in making such pages young or otherwise
respectively since the last invocation of the command.
young-making rate
and
not
provides the same rate but in terms of
overall buffer cache accesses instead of accesses just to the
“old” pages.
This is the User’s Guide for InnoDB storage engine 1.1 for MySQL 5.5, generated on 2010-04-13 (revision: 19994) .