Как мы можем убедиться, что для отношения создан внутренний индекс?

0

От qaru.site/questions/15984946/...

Если таблица не имеет PRIMARY KEY или подходящего UNIQUE-индекса, InnoDB внутренне генерирует скрытый кластерный индекс с именем GEN_CLUST_INDEX на синтетическом столбце, содержащем значения идентификатора строки. Строки упорядочены по идентификатору, который InnoDB присваивает строкам в такой таблице. Идентификатор строки - это 6-байтовое поле, которое монотонно возрастает при вставке новых строк. Таким образом, строки, упорядоченные идентификатором строки, физически находятся в порядке размещения.

Моя версия mysql:

$ mysql --version
mysql  Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)

Я выполнил команды там, чтобы убедиться, что внутренний индекс создан, но последняя команда не показывает, что какой-либо индекс был создан. Это почему? Благодарю.

Обратите внимание, что я немного изменил последнюю команду, потому что исходная команда дает мне Unknown table 'INNODB_INDEX_STATS' in information_schema ошибке Unknown table 'INNODB_INDEX_STATS' in information_schema.

# Create the table
create table test.check_table (id int, description varchar(10)) ENGINE = INNODB;

# Verify that there is no primary or unique column
desc test.check_table;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(11)     | YES  |     | NULL    |       |
| description | varchar(10) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+


# Insert some values
insert into test.check_table values(1, 'value-1');
insert into test.check_table values(2, 'value-2');
insert into test.check_table values(null, 'value-3');
insert into test.check_table values(4, null);
insert into test.check_table values(1, 'value-1');


# Verify table
select * from test.check_table;
+------+-------------+
| id   | description |
+------+-------------+
|    1 | value-1     |
|    2 | value-2     |
| NULL | value-3     |
|    4 | NULL        |
|    1 | value-1     |
+------+-------------+


# Verify that the GEN_CLUST_INDEX index is auto-created.
select * from INFORMATION_SCHEMA.INNODB_INDEX_STATS where TABLE_SCHEMA='test' and TABLE_NAME = 'check_table';

ERROR 1109 (42S02): Unknown table 'INNODB_INDEX_STATS' in information_schema


SELECT DISTINCT     TABLE_NAME, COLUMN_NAME ,    INDEX_NAME FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME='check_table';
Empty set (0.00 sec)
Теги:

2 ответа

1
Лучший ответ

Во всех версиях MySQL, которые я смог найти, таблица INNODB_INDEX_STATS находится в базе данных mysql, а не INFORMATION_SCHEMA. Это, по-видимому, ошибка в сообщении, на которое вы ссылаетесь.

mysql> select * from mysql.innodb_index_stats where table_name = 'check_table';
+---------------+-------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name  | index_name      | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+-------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| test          | check_table | GEN_CLUST_INDEX | 2018-07-10 11:34:01 | n_diff_pfx01 |          5 |           1 | DB_ROW_ID                         |
| test          | check_table | GEN_CLUST_INDEX | 2018-07-10 11:34:01 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| test          | check_table | GEN_CLUST_INDEX | 2018-07-10 11:34:01 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+-------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+

Этот индекс не является "реальным" индексом с точки зрения SQL (он не появляется в выводе DESCRIBE и не может быть изменен или удален), поэтому он не отображается в INFORMATION_SCHEMA.STATISTICS.

0

Для версии 8.0.11 таблица innodb_index_stats находится в схеме mysql вместо INFORMATION_SCHEMA. Следуя командам, последний запрос дает результат, как показано ниже:

mysql> select VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.11    |
+-----------+

mysql> select * from mysql.innodb_index_stats where database_name='test' and table_name = 'check_table';
+---------------+-------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name  | index_name      | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+-------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| test          | check_table | GEN_CLUST_INDEX | 2018-07-10 18:57:45 | n_diff_pfx01 |          5 |           1 | DB_ROW_ID                         |
| test          | check_table | GEN_CLUST_INDEX | 2018-07-10 18:57:45 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| test          | check_table | GEN_CLUST_INDEX | 2018-07-10 18:57:45 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+-------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+

Кроме того, сообщение, указанное в вопросе, создает вторую таблицу с указанным первичным ключом. Проверка индекса для этого запроса дает:

mysql> create table test.check_table_2 (id int, description varchar(10), PRIMARY KEY(id)) ENGINE = INNODB;

mysql> desc check_table_2;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(11)     | NO   | PRI | NULL    |       |
| description | varchar(10) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

mysql> select * from mysql.innodb_index_stats where database_name='test' and table_name = 'check_table_2';
+---------------+---------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name    | index_name | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+---------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
| test          | check_table_2 | PRIMARY    | 2018-07-10 19:00:39 | n_diff_pfx01 |          0 |           1 | id                                |
| test          | check_table_2 | PRIMARY    | 2018-07-10 19:00:39 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| test          | check_table_2 | PRIMARY    | 2018-07-10 19:00:39 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+---------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+

Ещё вопросы

Сообщество Overcoder
Наверх
Меню