0

我有一张这样的桌子:

  `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 则不能插入。

或者我可以为三列创建一个唯一索引,这样表就不会接受重复的新记录。

问题是:哪种方式更快?因为那将是一个大型数据库...

4

3 回答 3

1

索引显然更快,因为它是为该用例设计的。它将加快您正在寻找的元组的搜索,如果不满足约束,它将发送一个错误,因此,在您的处理脚本中,您将比获取结果更容易(和更快)处理它,等等。

于 2013-02-25T19:23:04.333 回答
1

假设用户尝试添加冲突记录的频率低于有效记录,那么复合索引将更快。SQL 引擎将维护索引并在违反索引约束时抛出错误。

即使您确实选择了 select 方法,您也需要维护索引。除此之外,将结果集从选择中拉回应用程序的内存空间,然后检查结果比在索引约束上强制执行要慢得多。

有关更多信息,请参阅:https ://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

于 2013-02-25T19:26:04.953 回答
1

几个建议。

使用tstatus = 'pending';而不是tstatus like 'pending';

如果您只考虑“待定”状态,则创建复合主键tid, tcontid, tstatus可能不起作用。其他状态呢?

如果您决定为这些列建立索引,我建议您tstatus在此处创建一个单独的表并使用外键引用。因此,它将为索引列节省空间,并且您的查询将始终在索引字段上运行。

于 2013-02-25T19:41:22.183 回答