具有相同名称的多个 MySQL 键的含义

Implication of multiple MySQL keys with the same name

使用单独的查询,我可以将非唯一索引添加到 MySQL table,每个索引都有自己的键名,如下所示:

但是当我使用 PHP 框架 (CodeIgniter 3) 的数据库 forge class 在 CREATE TABLE 查询期间添加几个键时,它们都得到相同的 Key_name,但具有不同的 Seq_in_index 值。

PHP代码:

$this->dbforge->add_key(['estimate_id', 'order_number']);
// produces: KEY `estimate_id_order_number` (`estimate_id `, `order_number `)

生成的键:

我真的不知道可以这么说哪个“更好”。后一个 table 配置似乎表明单个键用于索引 estimate_idorder_id.

这会导致任何问题,例如字段之间的歧义吗?

table 设计是否有任何性能影响?

什么样的情况可能需要不同的键名?

这是一个 composite key 也称为复合索引。 BTREE 索引中包含多个列。

在您的情况下,密钥定义为

 ALTER TABLE tbl
     ADD KEY estimate_id_order_number (estimate_id, order_number)

密钥的名称estimate_id_order_number只是一个名称。你可以用那个名字来drop the key later if you decide you don't need it. You can use it to remind you the purpose of the index. It shows up in query plans. And if you must use an index hint,你用的是索引名。它没有其他用途 -- none -- 在查询期间。[​​=18=]

如果您有这样的查询

SELECT id FROM tbl WHERE estimate_id = 123 AND order_number = 321

SELECT id FROM tbl WHERE estimate_id = 123 ORDER BY order_number

这个索引将使运行非常快:可以从组合键满足查询。

但是如果你有

SELECT id FROM tbl WHERE order_number = 321

它无济于事:复合索引仅在 WHERE 子句提及其 first 列时才有用。但是带有 (order_number, estimate_id) 列的键会有所帮助。