唯一可以用作索引吗?

时间:2016-04-21 17:18:09

标签: mysql sql indexing

我有这张桌子:

import SidebarHubs from '../containers/sidebar_hubs.js';

这也是我的查询的一部分:

// votes
+----+---------+---------+
| id | user_id | post_id |
+----+---------+---------+
| 1  | 12345   | 12      |
| 2  | 12345   | 13      |
| 3  | 52344   | 12      |
+----+---------+---------+

为了提高查询效率,我在EXISTS (select 1 from votes v where u.id = v.user_id and p.id = v.post_id) user_id添加了一个索引组:

post_id

我的问题是什么?我还想防止从一个用户到一个帖子的重复投票。所以我必须在ALTER TABLE `votes` ADD INDEX `user_id,post_id` (`user_id,post_id`) user_id上创建一个唯一索引。现在我想知道,我应该创建另一个索引吗?或者只是一个唯一的索引就足够了,我应该删除以前的索引?

3 个答案:

答案 0 :(得分:1)

如果您试图阻止来自同一user_id到同一post_id的多次投票,那么为什么不使用UNIQUE constraint

ALTER TABLE votes
ADD CONSTRAINT uc_votes UNIQUE (user_id,post_id)

关于是否应删除索引,您应该查看查询计划执行路径和性能的EXPLAIN概念。我怀疑保留它们会更好,但需要进行测试。

答案 1 :(得分:1)

您不需要两个用于类似目的的索引。在Apache POI操作期间只会使用其中一个,并且必须在selectinsert, update上修改这两个。这些是不必要的开销。使用唯一索引,因为它既可用于此目的。在delete子句中使用唯一索引列时,几乎可以保证范围扫描。

编辑:

索引一词并不重要。在创建索引时,会创建B树结构,选择方便的根节点并重新排列列值。如果给定列中的所有条目都是唯一的,则普通索引也将与唯一索引具有相同的大小,并且将提供与唯一索引相同的性能。

主索引也是一个唯一索引,但不允许使用空值。在唯一索引中允许使用空值。

答案 2 :(得分:1)

在MySQL中:
PRIMARY KEYUNIQUEUNIQUE密钥是INDEX “index”和“key”是同义词。