如果我在两个字段上定义一个MySQL索引,我怎么知道哪两个属于一起(使用MySQL命令)。
以下是一个示例表:
mysql> DESCRIBE lansuite_wiki_versions;
+-----------+-----------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------+------+-----+-------------------+-----------------------------+
| versionid | int(11) | NO | PRI | 0 | |
| postid | int(11) | NO | PRI | 0 | |
| date | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| userid | mediumint(8) unsigned | NO | MUL | 0 | |
| text | text | NO | MUL | NULL | |
| test1 | int(11) | NO | MUL | NULL | |
| test2 | int(11) | NO | | NULL | |
+-----------+-----------------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.00 sec)
此表具有定义的索引:
我知道这一点,因为我已经分配了它们并在phpmyadmin中看到它们。 但是我想在我的应用程序中看到它。 所以我发现了这个mySQL命令:
mysql> SHOW INDEX FROM lansuite_wiki_versions;
+------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| lansuite_wiki_versions | 0 | PRIMARY | 1 | versionid | A | NULL | NULL | NULL | | BTREE | |
| lansuite_wiki_versions | 0 | PRIMARY | 2 | postid | A | 144 | NULL | NULL | | BTREE | |
| lansuite_wiki_versions | 1 | userid | 1 | userid | A | 4 | NULL | NULL | | BTREE | |
| lansuite_wiki_versions | 1 | test | 1 | test1 | A | 1 | NULL | NULL | | BTREE | |
| lansuite_wiki_versions | 1 | test | 2 | test2 | A | 1 | NULL | NULL | | BTREE | |
| lansuite_wiki_versions | 1 | text | 1 | text | NULL | 1 | NULL | NULL | | FULLTEXT | |
+------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
6 rows in set (0.00 sec)
但是如何看到versionid + postid已连接? 我可以看到Seq_in_index向上计数。那么我可以依赖于那个versionid和postid形成一个公共索引,只是因为它们在这个输出中彼此相邻并且Seq_in_index计数了吗? 或者是否有另一个命令,它显示我定义了哪些索引?
答案 0 :(得分:3)
每个索引的Key_name都是唯一的;作为同一索引一部分的列在此表中具有相同的名称。
seq_in_index为您提供序列。
如果查看包含索引的INFORMATION_SCHEMA表,可能会更有意义(查看文档)。
我假设您正在编写一个以编程方式检查数据库结构的工具。
如果你是一个人并希望看到表结构,我建议改为SHOW CREATE TABLE。
答案 1 :(得分:1)
键名列显示正在描述的索引。索引中的序列显示该索引中列的顺序。因此,在您的示例中,您在versionid和postid上有一个PRIMARY KEY,在userid上有一个非唯一的密钥用户ID,在test1和test2上有一个非唯一的密钥测试等。
答案 2 :(得分:0)
您不应该信任查询SHOW INDEX FROM table
,有时它会丢失一个或多个索引。
我更喜欢:
SELECT DISTINCT
INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'DBNAME' and TABLE_NAME='TABLE';