我有这张桌子:
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
上创建一个唯一索引。现在我想知道,我应该创建另一个索引吗?或者只是一个唯一的索引就足够了,我应该删除以前的索引?
答案 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
操作期间只会使用其中一个,并且必须在select
和insert, update
上修改这两个。这些是不必要的开销。使用唯一索引,因为它既可用于此目的。在delete
子句中使用唯一索引列时,几乎可以保证范围扫描。
编辑:
索引一词并不重要。在创建索引时,会创建B树结构,选择方便的根节点并重新排列列值。如果给定列中的所有条目都是唯一的,则普通索引也将与唯一索引具有相同的大小,并且将提供与唯一索引相同的性能。
主索引也是一个唯一索引,但不允许使用空值。在唯一索引中允许使用空值。
答案 2 :(得分:1)
在MySQL中:
PRIMARY KEY
是UNIQUE
键
UNIQUE
密钥是INDEX
“index”和“key”是同义词。