我有一张这样的表:
`id` int(11) NOT NULL AUTO_INCREMENT,
`torderid` int(11) DEFAULT NULL,
`tuid` int(11) DEFAULT NULL,
`tcontid` int(11) DEFAULT NULL,
`tstatus` varchar(10) DEFAULT 'pending',
这里的规则是同一个用户UID不能有多个具有相同contid的待处理订单。
所以我能做的第一件事就是检查是否有这样的待处理订单:
select count(id) into @cnt from tblorders where tuid = 1 and tcontid=5 and tstatus like 'pending';
如果是> 0然后无法插入。
或者我可以为这三列创建一个唯一索引,这样表就不会接受重复项的新记录。
问题是: 哪种方式更快?因为那将是一个大型数据库...
答案 0 :(得分:1)
索引显然更快,因为它是为该用例设计的。 它将固定您正在寻找的元组的搜索,如果不满足约束,它将发送错误,因此,在您的治疗脚本中,您将比获取结果更容易(和更快)处理它,等等。 / p>
答案 1 :(得分:1)
假设用户试图比有效记录更少地添加冲突记录,那么复合索引会更快。当引发索引约束时,SQL引擎将维护索引并抛出错误。
即使您确实选择了select方法,也需要维护索引。除此之外,将结果集从选择中一直拉回到应用程序的内存空间,然后检查结果要比在索引约束上强制执行它要慢得多。
有关详细信息,请参阅:https://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html
答案 2 :(得分:1)
很少有建议。
使用tstatus = 'pending';
代替tstatus like 'pending';
如果您只考虑“待处理”状态,则可能无法为tid, tcontid, tstatus
创建复合主键。其他状态怎么样?
如果您决定索引列,我建议您为tstatus
创建一个单独的表,并在此处使用外键引用。因此,它将为索引列保存空间,并且您的查询将始终在索引字段上运行。