唯一键和索引 - 我应该同时使用它们

时间:2015-11-26 01:25:19

标签: mysql

我的桌子上有一些"电话号码","邮政编码"和#34;门牌号码",所以它们在桌子上是唯一的(手机X只能在邮政编码Y和门牌号Z一次)所以我用这3个一起创造了一个独特的键,但我也想搜索电话号码,查找​​哪些电话采用邮政编码。

那么......我应该为3个组合使用一个唯一的密钥并为每个密钥创建一个索引,或者唯一密钥已经完成了仅搜索特定数字的工作吗?

2 个答案:

答案 0 :(得分:1)

我非常确定,在引擎盖下,MySQL将唯一键作为索引实现,附加约束条件是构成索引的列必须是唯一的。

在您的特定情况下,我不会创建任何其他索引。唯一的密钥应该很好地覆盖您的电话号码查找和电话号码/邮政编码查找。

如果您担心您的查询可能没有使用密钥进行查找,请在查询前弹出关键字EXPLAIN,MySQL将显示"查询plan",其中包含有关该查询使用哪些键/索引的信息。在网上找到解释如何解释这个输出的文章应该很容易。

答案 1 :(得分:1)

密钥(索引)仅在left-most向右的情况下有用,直到该查询中的列(但在索引中)使用该索引路径。

对于单列索引,当然,该索引只有一个最左列。

mysql中的复合键是一个键,它是多个列的组合。密钥本身可以是唯一密钥(允许列的唯一组合,但只允许1行数据)。

因此,如果您在(a,b,c)上有一个复合键,则仅对aab或全部三个都有用。但只有在一起搜索ac时才会有部分内容。部分地,意思是,在用于a之后,它会转换为非索引搜索(作为where),然后选择c。所以它会让你接近,但之后几乎是一个小型或微型的桌面扫描,用来表达一个短语。

通常会有一些复合键,在最左边的加权列周围翻转。但一切都需要付出代价。搜索很棒。它会减慢插入和更新。

请参阅手册页Multiple-Column Indexes以了解更多信息。并关注left-most概念。

让你的复合索引变瘦。如果使用得好,复合材料中的三个int列可能很棒。那里有一些较大的varchars,不好。

无论你做什么,都不要因为你创建一个将被使用的索引而欺骗自己。这只能通过使用诸如mysql中的Explain工具之类的工具来确定。如果不使用它们,您只需减慢所有这些插入和更新。另见文章Using Explain to Write Better Mysql Queries