#### 27.12.20.8 Table I/O and Lock Wait Summary Tables

 The following sections describe the table I/O and lock wait summary tables:

* [`table_io_waits_summary_by_index_usage`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-index-usage-table): Table I/O waits per index

* [`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table): Table I/O waits per table

* [`table_lock_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-lock-waits-summary-by-table-table): Table lock waits per table

##### 27.12.20.8.1 The table\_io\_waits\_summary\_by\_table Table

[]()[]()

 The [`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table) table aggregates all table I/O wait events, as generated by the `wait/io/table/sql/handler` instrument. The grouping is by table.

 The [`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table) table has these grouping columns to indicate how the table aggregates events: `OBJECT_TYPE`, `OBJECT_SCHEMA`, and `OBJECT_NAME`. These columns have the same meaning as in the [`events_waits_current`](performance-schema-events-waits-current-table.html) table. They identify the table to which the row applies.

[`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table) has the following summary columns containing aggregated values. As indicated in the column descriptions, some columns are more general and have values that are the same as the sum of the values of more fine-grained columns. For example, columns that aggregate all writes hold the sum of the corresponding columns that aggregate inserts, updates, and deletes. In this way, aggregations at higher levels are available directly without the need for user-defined views that sum lower-level columns.

* `COUNT_STAR`, `SUM_TIMER_WAIT`, `MIN_TIMER_WAIT`, `AVG_TIMER_WAIT`, `MAX_TIMER_WAIT`

   These columns aggregate all I/O operations. They are the same as the sum of the corresponding `*`xxx`*_READ` and `*`xxx`*_WRITE` columns.

* `COUNT_READ`, `SUM_TIMER_READ`, `MIN_TIMER_READ`, `AVG_TIMER_READ`, `MAX_TIMER_READ`

   These columns aggregate all read operations. They are the same as the sum of the corresponding `*`xxx`*_FETCH` columns.

* `COUNT_WRITE`, `SUM_TIMER_WRITE`, `MIN_TIMER_WRITE`, `AVG_TIMER_WRITE`, `MAX_TIMER_WRITE`

   These columns aggregate all write operations. They are the same as the sum of the corresponding `*`xxx`*_INSERT`, `*`xxx`*_UPDATE`, and `*`xxx`*_DELETE` columns.

* `COUNT_FETCH`, `SUM_TIMER_FETCH`, `MIN_TIMER_FETCH`, `AVG_TIMER_FETCH`, `MAX_TIMER_FETCH`

   These columns aggregate all fetch operations.

* `COUNT_INSERT`, `SUM_TIMER_INSERT`, `MIN_TIMER_INSERT`, `AVG_TIMER_INSERT`, `MAX_TIMER_INSERT`

   These columns aggregate all insert operations.

* `COUNT_UPDATE`, `SUM_TIMER_UPDATE`, `MIN_TIMER_UPDATE`, `AVG_TIMER_UPDATE`, `MAX_TIMER_UPDATE`

   These columns aggregate all update operations.

* `COUNT_DELETE`, `SUM_TIMER_DELETE`, `MIN_TIMER_DELETE`, `AVG_TIMER_DELETE`, `MAX_TIMER_DELETE`

   These columns aggregate all delete operations.

 The [`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table) table has these indexes:

* Unique index on (`OBJECT_TYPE`, `OBJECT_SCHEMA`, `OBJECT_NAME`)

[`TRUNCATE TABLE`](truncate-table.html) is permitted for table I/O summary tables. It resets the summary columns to zero rather than removing rows. Truncating this table also truncates the [`table_io_waits_summary_by_index_usage`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-index-usage-table) table.

##### 27.12.20.8.2 The table\_io\_waits\_summary\_by\_index\_usage Table

[]()[]()

 The [`table_io_waits_summary_by_index_usage`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-index-usage-table) table aggregates all table index I/O wait events, as generated by the `wait/io/table/sql/handler` instrument. The grouping is by table index.

 The columns of [`table_io_waits_summary_by_index_usage`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-index-usage-table) are nearly identical to [`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table). The only difference is the additional group column, `INDEX_NAME`, which corresponds to the name of the index that was used when the table I/O wait event was recorded:

* A value of `PRIMARY` indicates that table I/O used the primary index.

* A value of `NULL` means that table I/O used no index.

* Inserts are counted against `INDEX_NAME = NULL`.

 The [`table_io_waits_summary_by_index_usage`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-index-usage-table) table has these indexes:

* Unique index on (`OBJECT_TYPE`, `OBJECT_SCHEMA`, `OBJECT_NAME`, `INDEX_NAME`)

[`TRUNCATE TABLE`](truncate-table.html) is permitted for table I/O summary tables. It resets the summary columns to zero rather than removing rows. This table is also truncated by truncation of the [`table_io_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table) table. A DDL operation that changes the index structure of a table may cause the per-index statistics to be reset.

##### 27.12.20.8.3 The table\_lock\_waits\_summary\_by\_table Table

[]()[]()

 The [`table_lock_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-lock-waits-summary-by-table-table) table aggregates all table lock wait events, as generated by the `wait/lock/table/sql/handler` instrument. The grouping is by table.

 This table contains information about internal and external locks:

* An internal lock corresponds to a lock in the SQL layer. This is currently implemented by a call to `thr_lock()`. In event rows, these locks are distinguished by the `OPERATION` column, which has one of these values:

  ```
  read normal
  read with shared locks
  read high priority
  read no insert
  write allow write
  write concurrent insert
  write delayed
  write low priority
  write normal
  ```

* An external lock corresponds to a lock in the storage engine layer. This is currently implemented by a call to `handler::external_lock()`. In event rows, these locks are distinguished by the `OPERATION` column, which has one of these values:

  ```
  read external
  write external
  ```

 The [`table_lock_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-lock-waits-summary-by-table-table) table has these grouping columns to indicate how the table aggregates events: `OBJECT_TYPE`, `OBJECT_SCHEMA`, and `OBJECT_NAME`. These columns have the same meaning as in the [`events_waits_current`](performance-schema-events-waits-current-table.html) table. They identify the table to which the row applies.

[`table_lock_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-lock-waits-summary-by-table-table) has the following summary columns containing aggregated values. As indicated in the column descriptions, some columns are more general and have values that are the same as the sum of the values of more fine-grained columns. For example, columns that aggregate all locks hold the sum of the corresponding columns that aggregate read and write locks. In this way, aggregations at higher levels are available directly without the need for user-defined views that sum lower-level columns.

* `COUNT_STAR`, `SUM_TIMER_WAIT`, `MIN_TIMER_WAIT`, `AVG_TIMER_WAIT`, `MAX_TIMER_WAIT`

   These columns aggregate all lock operations. They are the same as the sum of the corresponding `*`xxx`*_READ` and `*`xxx`*_WRITE` columns.

* `COUNT_READ`, `SUM_TIMER_READ`, `MIN_TIMER_READ`, `AVG_TIMER_READ`, `MAX_TIMER_READ`

   These columns aggregate all read-lock operations. They are the same as the sum of the corresponding `*`xxx`*_READ_NORMAL`, `*`xxx`*_READ_WITH_SHARED_LOCKS`, `*`xxx`*_READ_HIGH_PRIORITY`, and `*`xxx`*_READ_NO_INSERT` columns.

* `COUNT_WRITE`, `SUM_TIMER_WRITE`, `MIN_TIMER_WRITE`, `AVG_TIMER_WRITE`, `MAX_TIMER_WRITE`

   These columns aggregate all write-lock operations. They are the same as the sum of the corresponding `*`xxx`*_WRITE_ALLOW_WRITE`, `*`xxx`*_WRITE_CONCURRENT_INSERT`, `*`xxx`*_WRITE_LOW_PRIORITY`, and `*`xxx`*_WRITE_NORMAL` columns.

* `COUNT_READ_NORMAL`, `SUM_TIMER_READ_NORMAL`, `MIN_TIMER_READ_NORMAL`, `AVG_TIMER_READ_NORMAL`, `MAX_TIMER_READ_NORMAL`

   These columns aggregate internal read locks.

* `COUNT_READ_WITH_SHARED_LOCKS`, `SUM_TIMER_READ_WITH_SHARED_LOCKS`, `MIN_TIMER_READ_WITH_SHARED_LOCKS`, `AVG_TIMER_READ_WITH_SHARED_LOCKS`, `MAX_TIMER_READ_WITH_SHARED_LOCKS`

   These columns aggregate internal read locks.

* `COUNT_READ_HIGH_PRIORITY`, `SUM_TIMER_READ_HIGH_PRIORITY`, `MIN_TIMER_READ_HIGH_PRIORITY`, `AVG_TIMER_READ_HIGH_PRIORITY`, `MAX_TIMER_READ_HIGH_PRIORITY`

   These columns aggregate internal read locks.

* `COUNT_READ_NO_INSERT`, `SUM_TIMER_READ_NO_INSERT`, `MIN_TIMER_READ_NO_INSERT`, `AVG_TIMER_READ_NO_INSERT`, `MAX_TIMER_READ_NO_INSERT`

   These columns aggregate internal read locks.

* `COUNT_READ_EXTERNAL`, `SUM_TIMER_READ_EXTERNAL`, `MIN_TIMER_READ_EXTERNAL`, `AVG_TIMER_READ_EXTERNAL`, `MAX_TIMER_READ_EXTERNAL`

   These columns aggregate external read locks.

* `COUNT_WRITE_ALLOW_WRITE`, `SUM_TIMER_WRITE_ALLOW_WRITE`, `MIN_TIMER_WRITE_ALLOW_WRITE`, `AVG_TIMER_WRITE_ALLOW_WRITE`, `MAX_TIMER_WRITE_ALLOW_WRITE`

   These columns aggregate internal write locks.

* `COUNT_WRITE_CONCURRENT_INSERT`, `SUM_TIMER_WRITE_CONCURRENT_INSERT`, `MIN_TIMER_WRITE_CONCURRENT_INSERT`, `AVG_TIMER_WRITE_CONCURRENT_INSERT`, `MAX_TIMER_WRITE_CONCURRENT_INSERT`

   These columns aggregate internal write locks.

* `COUNT_WRITE_LOW_PRIORITY`, `SUM_TIMER_WRITE_LOW_PRIORITY`, `MIN_TIMER_WRITE_LOW_PRIORITY`, `AVG_TIMER_WRITE_LOW_PRIORITY`, `MAX_TIMER_WRITE_LOW_PRIORITY`

   These columns aggregate internal write locks.

* `COUNT_WRITE_NORMAL`, `SUM_TIMER_WRITE_NORMAL`, `MIN_TIMER_WRITE_NORMAL`, `AVG_TIMER_WRITE_NORMAL`, `MAX_TIMER_WRITE_NORMAL`

   These columns aggregate internal write locks.

* `COUNT_WRITE_EXTERNAL`, `SUM_TIMER_WRITE_EXTERNAL`, `MIN_TIMER_WRITE_EXTERNAL`, `AVG_TIMER_WRITE_EXTERNAL`, `MAX_TIMER_WRITE_EXTERNAL`

   These columns aggregate external write locks.

 The [`table_lock_waits_summary_by_table`](performance-schema-table-wait-summary-tables.html#performance-schema-table-lock-waits-summary-by-table-table) table has these indexes:

* Unique index on (`OBJECT_TYPE`, `OBJECT_SCHEMA`, `OBJECT_NAME`)

[`TRUNCATE TABLE`](truncate-table.html) is permitted for table lock summary tables. It resets the summary columns to zero rather than removing rows.

