我的桌子上有一些"电话号码","邮政编码"和#34;门牌号码",所以它们在桌子上是唯一的(手机X只能在邮政编码Y和门牌号Z一次)所以我用这3个一起创造了一个独特的键,但我也想搜索电话号码,查找哪些电话采用邮政编码。
那么......我应该为3个组合使用一个唯一的密钥并为每个密钥创建一个索引,或者唯一密钥已经完成了仅搜索特定数字的工作吗?
答案 0 :(得分:1)
我非常确定,在引擎盖下,MySQL将唯一键作为索引实现,附加约束条件是构成索引的列必须是唯一的。
在您的特定情况下,我不会创建任何其他索引。唯一的密钥应该很好地覆盖您的电话号码查找和电话号码/邮政编码查找。
如果您担心您的查询可能没有使用密钥进行查找,请在查询前弹出关键字EXPLAIN
,MySQL将显示"查询plan",其中包含有关该查询使用哪些键/索引的信息。在网上找到解释如何解释这个输出的文章应该很容易。
答案 1 :(得分:1)
密钥(索引)仅在left-most
向右的情况下有用,直到该查询中不的列(但在索引中)使用该索引路径。
对于单列索引,当然,该索引只有一个最左列。
mysql中的复合键是一个键,它是多个列的组合。密钥本身可以是唯一密钥(允许列的唯一组合,但只允许1行数据)。
因此,如果您在(a,b,c)上有一个复合键,则仅对a
,a
和b
或全部三个都有用。但只有在一起搜索a
和c
时才会有部分内容。部分地,意思是,在用于a
之后,它会转换为非索引搜索(作为where
),然后选择c
。所以它会让你接近,但之后几乎是一个小型或微型的桌面扫描,用来表达一个短语。
通常会有一些复合键,在最左边的加权列周围翻转。但一切都需要付出代价。搜索很棒。它会减慢插入和更新。
请参阅手册页Multiple-Column Indexes以了解更多信息。并关注left-most
概念。
让你的复合索引变瘦。如果使用得好,复合材料中的三个int
列可能很棒。那里有一些较大的varchars
,不好。
无论你做什么,都不要因为你创建一个将被使用的索引而欺骗自己。这只能通过使用诸如mysql中的Explain工具之类的工具来确定。如果不使用它们,您只需减慢所有这些插入和更新。另见文章Using Explain to Write Better Mysql Queries。