标签:
1: INNODB_SYS_VIRTUAL
表存储的是INNODB表的虚拟列的信息,当然这个还是比较简单的,我们直接通过SHOW CREATE TABLE 或者DESC TABLE就能看得到。
在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与Virtual Column相比并没有优势,因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column。
如果需要Stored Generated Golumn的话,可能在Virtual Generated Column上建立索引更加合适
综上,一般情况下,都使用Virtual Generated Column,这也是MySQL默认的方式
基本语法是:
<type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ]
[ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]
例子:
create table user(uid int auto_increment,data json,primary key(uid));
insert into user values (NULL,‘{"name":"wang","address":"shenyang"}‘); insert into user values (NULL,‘{"name":"zhao","address":"riben"}‘);
alter table user add user_name varchar(20) generated always as (data->‘$.name‘);
不过虚拟列还是要加上索引的。
2:INNODB_SYS_INDEXES
提供相关INNODB表的索引的相关信息,和SYS_INDEXES 这个表存储的信息基本是一样的,只不过后者提供的是所有存储引擎的索引信息,后者只提供INNODB表的索引信息。
看一下官方文档的解释:
Column name |
Description |
INDEX_ID |
An identifier for each index that is unique across all the databases in an instance. |
NAME |
The name of the index. Most indexes created implicitly by InnoDB have consistent names but the index names are not necessarily unique. For example, PRIMARY for a primary key index, GEN_CLUST_INDEX for the index representing a primary key when one is not specified, andID_IND, FOR_IND, and REF_IND for foreign key constraints. |
TABLE_ID |
An identifier representing the table associated with the index; the same value from INNODB_SYS_TABLES.TABLE_ID. |
TYPE |
A numeric identifier signifying the kind of index. 0 = Secondary Index, 1 = Clustered Index, 2 = Unique Index, 3 = Primary Index, 32 = Full-text Index, 64 = Spatial Index, 128 = A secondary index that includes a generated virtual column. |
N_FIELDS |
The number of columns in the index key. For the GEN_CLUST_INDEX indexes, this value is 0 because the index is created using an artificial value rather than a real table column. |
PAGE_NO |
The root page number of the index B-tree. For full-text indexes, the PAGE_NO field is unused and set to -1 (FIL_NULL) because the full-text index is laid out in several B-trees (auxiliary tables). |
SPACE |
An identifier for the tablespace where the index resides. 0 means the InnoDB system tablespace. Any other number represents a table created in file-per-table mode with a separate .ibd file. This identifier stays the same after a TRUNCATE TABLE statement. Because all indexes for a table reside in the same tablespace as the table, this value is not necessarily unique. |
MERGE_THRESHOLD |
The merge threshold value for index pages. If the amount of data in an index page falls below the MERGE_THRESHOLD value when a row is deleted or when a row is shortened by an update operation, InnoDB attempts to merge the index page with the neighboring index page. The default threshold value is 50%. The MERGE_THRESHOLD column was added to INNODB_SYS_INDEXES in MySQL 5.7.6. For more information, see Section 15.6.12, “Configuring the Merge Threshold for Index Pages”. |
3: INNODB_METRICS
提供INNODB的各种的性能指数,是对INFORMATION_SCHEMA的补充,收集的是MySQL的系统统计信息。这些统计信息都是可以手动配置打开还是关闭的。有以下参数都是可以控制的:
innodb_monitor_enable, innodb_monitor_disable, innodb_monitor_reset, innodb_monitor_reset_all,
这些都是mysql的启动参数,给个启动例子:
--innodb_monitor_enable=[counter|module|pattern|all]
Column name |
Description |
NAME |
Unique name for the counter. |
SUBSYSTEM |
The aspect of InnoDB that the metric applies to. See the list following the table for the corresponding module names to use with the SET GLOBAL syntax. |
COUNT |
Value since the counter is enabled. |
MAX_COUNT |
Maximum value since the counter is enabled. |
MIN_COUNT |
Minimum value since the counter is enabled. |
AVG_COUNT |
Average value since the counter is enabled. |
COUNT_RESET |
Counter value since it was last reset. (The _RESET fields act like the lap counter on a stopwatch: you can measure the activity during some time interval, while the cumulative figures are still available in the COUNT, MAX_COUNT, and so on fields.) |
MAX_COUNT_RESET |
Maximum counter value since it was last reset. |
MIN_COUNT_RESET |
Minimum counter value since it was last reset. |
AVG_COUNT_RESET |
Average counter value since it was last reset. |
TIME_ENABLED |
Timestamp of last start. |
TIME_DISABLED |
Timestamp of last stop. |
TIME_ELAPSED |
Elapsed time in seconds since the counter started. |
TIME_RESET |
Timestamp of last stop. |
STATUS |
Whether the counter is still running (enabled) or stopped (disabled). |
TYPE |
Whether the item is a cumulative counter, or measures the current value of some resource. |
COMMENT |
Counter description. |
3: INNODB_TEMP_TABLE_INFO
存储的是INNODB的关于元数据的相关信息,如果要优化临时表的信息的时候就要用到这个表的信息INNODB_TEMP_TABLE_INFO,这个表惠记录所有的INNODB的所有用户使用到的信息,但是只能记录在内存中和没有持久化的信息。看一下官方的解释
Column name |
Description |
TABLE_ID |
The table ID of the active temporary table. |
NAME |
The name of the active temporary table. |
N_COLS |
The number of columns in the temporary table. The number always includes three hidden columns created by InnoDB (DB_ROW_ID, DB_TRX_ID, and DB_ROLL_PTR). |
SPACE |
The tablespace identifier (a numerical value) for the tablespace in which the temporary table resides. As of MySQL 5.7.1, all non-compressedInnoDB temporary tables reside in a shared temporary tablespace, as defined by innodb_temp_data_file_path. By default the shared temporary tablespace is named ibtmp1 and located in the data directory. Compressed temporary tables reside in separate per-table tablespaces located in the temporary file directory, as defined by tmpdir. The SPACE ID is always a non-zero value and is dynamically generated on server restart. |
PER_TABLE_SPACE |
A value of TRUE indicates that the temporary table resides in a separate per-table tablespace. A value of FALSE indicates that the temporary table resides in the shared temporary tablespace. |
IS_COMPRESSED |
A value of TRUE indicates that the temporary table is compressed. |
4:INNODB_BUFFER_PAGE
这个表就比较屌了,存的是buffer里面缓冲的页数据。查询这个表会对性能产生很严重的影响,千万不要再我们自己的生产库上面执行这个语句,除非你能接受服务短暂的停顿。看一下官方的揭示
Column name |
Description |
POOL_ID |
Buffer Pool ID. An identifier to distinguish between multiple buffer pool instances. |
BLOCK_ID |
Buffer Pool Block ID. |
SPACE |
Tablespace ID. Uses the same value as in INNODB_SYS_TABLES.SPACE. |
PAGE_NUMBER |
Page number. |
PAGE_TYPE |
Page type. One of ALLOCATED (Freshly allocated page), INDEX (B-tree node), UNDO_LOG (Undo log page), INODE (Index node),IBUF_FREE_LIST (Insert buffer free list), IBUF_BITMAP (Insert buffer bitmap), SYSTEM (System page), TRX_SYSTEM (Transaction system data), FILE_SPACE_HEADER (File space header), EXTENT_DESCRIPTOR (Extent descriptor page), BLOB (Uncompressed BLOB page), COMPRESSED_BLOB (First compressed BLOB page), COMPRESSED_BLOB2 (Subsequent comp BLOB page), IBUF_INDEX (Insert buffer index), RTREE_INDEX (spatial index), UNKNOWN (unknown). |
FLUSH_TYPE |
Flush type. |
FIX_COUNT |
Number of threads using this block within the buffer pool. When zero, the block is eligible to be evicted. |
IS_HASHED |
Whether hash index has been built on this page. |
NEWEST_MODIFICATION |
Log Sequence Number of the youngest modification. |
OLDEST_MODIFICATION |
Log Sequence Number of the oldest modification. |
ACCESS_TIME |
An abstract number used to judge the first access time of the page. |
TABLE_NAME |
Name of the table the page belongs to. This column is only applicable to pages of type INDEX. |
INDEX_NAME |
Name of the index the page belongs to. It can be the name of a clustered index or a secondary index. This column is only applicable to pages of type INDEX. |
NUMBER_RECORDS |
Number of records within the page. |
DATA_SIZE |
Sum of the sizes of the records. This column is only applicable to pages of type INDEX. |
COMPRESSED_SIZE |
Compressed page size. Null for pages that are not compressed. |
PAGE_STATE |
Page state. A page with valid data has one of the following states: FILE_PAGE (buffers a page of data from a file), MEMORY (buffers a page from an in-memory object), COMPRESSED. Other possible states (managed by InnoDB) are: NULL, READY_FOR_USE, NOT_USED,REMOVE_HASH. |
IO_FIX |
Specifies whether any I/O is pending for this page: IO_NONE = no pending I/O, IO_READ = read pending, IO_WRITE = write pending. |
IS_OLD |
Specifies whether or not the block is in the sublist of old blocks in the LRU list. |
FREE_PAGE_CLOCK |
The value of the freed_page_clock counter when the block was the last placed at the head of the LRU list. Thefreed_page_clock counter tracks the number of blocks removed from the end of the LRU list. |
MySQL的内部机制是很奇怪的,当表,表数据,索引被删除的时候,其实并不会立即删除,而是保存再buffer pool里面,直到这些空间被别的新数据等需要的时候,才会被从buffer pool里面抹除。
5: INNODB_BUFFER_PAGE_LRU
这个表和的所有列是一样的,除了用LRU_POSITION 代替了BLOCK_ID 。首先我们要了解一下LRU是个什么东西。
MySQL的InnoDB引擎设置有索引及数据缓存池,其中用到的LRU算法来维持缓存的命中率
这里用到了顺序表list来作为缓冲池,每个数据节点称为block
该算法采用“中点插入法”:当插入一个新block时,移除表尾最近最少使用的block,在中点插入新block。
这个中点将链表分为两部分:
1.靠近表头的一部分,为young区,这里的block是最近使用的节点
2.靠近表尾的一部分,为old区,这里的block是最近少使用的
该算法通过链表中的block的使用热度来维持各block的位置,其中old区的block为链表满的时候移除的候选区
具体算法如下:
1.链表的3/8被设置为old区
2.中点不是链表的中间点,而是old区的表头节点,即old区与young区的相邻的那个节点
3.当读取的数据不在缓冲池里的时候,读取到的block需要插入到链表中,插入点为中点,但是插入的新节点为old区的节点,如果此时old区满了得话,移除表尾的block(LRU节点)
4.当读取old区的block时,该节点将变成“young”节点:此节点移动到young区的表头(young区的头部那里)
5.在数据库操作中,被访问的节点将移除到young的表头,这样一来,在young区中的未被访问的节点将逐渐往表尾移动,当移动过中点,将变为old区的节点。而old区的节点若被访问到将变为young节点移动到表头,而old区中的为被访问的节点依旧往表尾移动,当表满时,表尾那个block将会被淘汰掉
6:INNODB_BUFFER_POOL_STATS
表提供有关INNODB 的buffer pool相关信息,和show engine innodb status提供的信息是相同的。buffer pool里的数据是young 还是 NOT young取决于是否将数据一到头部或者尾部。young数据会被保存更久的时间,而相反的,其他not young的数据就会被擦除当新数据被写入buffer pool里面的时候。
Column name |
Description |
POOL_ID |
Buffer Pool ID. A unique identifier to distinguish between multiple buffer pool instances. |
POOL_SIZE |
The InnoDB buffer pool size in pages. |
FREE_BUFFERS |
The number of free pages in the InnoDB buffer pool |
DATABASE_PAGES |
The number of pages in the InnoDB buffer pool containing data. The number includes both dirty and clean pages. |
OLD_DATABASE_PAGES |
The number of pages in the old buffer pool sublist. |
MODIFIED_DATABASE_PAGES |
The number of modified (dirty) database pages |
PENDING_DECOMPRESS |
The number of pages pending decompression |
PENDING_READS |
The number of pending reads |
PENDING_FLUSH_LRU |
The number of pages pending flush in the LRU |
PENDING_FLUSH_LIST |
The number of pages pending flush in the flush list |
PAGES_MADE_YOUNG |
The number of pages made young |
PAGES_NOT_MADE_YOUNG |
The number of pages not made young |
PAGES_MADE_YOUNG_RATE |
The number of pages made young per second (pages made young since the last printout / time elapsed) |
PAGES_MADE_NOT_YOUNG_RATE |
The number of pages not made per second (pages not made young since the last printout / time elapsed) |
NUMBER_PAGES_READ |
The number of pages read |
NUMBER_PAGES_CREATED |
The number of pages created |
NUMBER_PAGES_WRITTEN |
The number of pages written |
PAGES_READ_RATE |
The number of pages read per second (pages read since the last printout / time elapsed) |
PAGES_CREATE_RATE |
The number of pages created per second (pages created since the last printout / time elapsed) |
PAGES_WRITTEN_RATE |
The number of pages written per second (pages written since the last printout / time elapsed) |
NUMBER_PAGES_GET |
The number of logical read requests. |
HIT_RATE |
The buffer pool hit rate |
YOUNG_MAKE_PER_THOUSAND_GETS |
The number of pages made young per thousand gets |
NOT_YOUNG_MAKE_PER_THOUSAND_GETS |
The number of pages not made young per thousand gets |
NUMBER_PAGES_READ_AHEAD |
The number of pages read ahead |
NUMBER_READ_AHEAD_EVICTED |
The number of pages read into the InnoDB buffer pool by the read-ahead background thread that were subsequently evicted without having been accessed by queries. |
READ_AHEAD_RATE |
The read ahead rate per second (pages read ahead since the last printout / time elapsed) |
READ_AHEAD_EVICTED_RATE |
The number of read ahead pages evicted without access per second (read ahead pages not accessed since the last printout / time elapsed) |
LRU_IO_TOTAL |
LRU IO total |
LRU_IO_CURRENT |
LRU IO for the current interval |
UNCOMPRESS_TOTAL |
Total number of pages decompressed |
UNCOMPRESS_CURRENT |
The number of pages decompressed in the current interval |
我们看得到PAGES_NOT_MADE_YOUNG这列的数值很大的时候说明buffer pool的命中率是很低的,这就说明系统的性能是可能有问题的,内存压力较大,可以适当调大buffer pool的大小。
要说明LRU那边解释的元文目录:http://www.cnblogs.com/iamsupercp/p/3682659.html
尊重原创。
information_schema系列十二
标签:
原文地址:http://www.cnblogs.com/shengdimaya/p/5925884.html