哪种SQL方法最佳?

时间:2012-02-02 17:36:51

标签: mysql sql database

我有一个相当大的表(几千条记录),并且不能确保在同一天不能创建重复项。

任何SQL专家知道哪些方法是最优的,如果是,你能解释一下原因吗?

{ created at is a DATETIME column }
SELECT `records`.* 
 FROM `records` 
 WHERE DATE(records.created_at) = '2012-02-02';

SELECT `records`.* 
FROM `records` 
WHERE records.created_at BETWEEN '2012-02-02 00:00:00' AND '2012-02-02 23:59:59';

3 个答案:

答案 0 :(得分:2)

这看起来像MySQL(不是我的强项)所以我可能会说完全胡说八道,但我会调查

  • 将计算列create_at_date创建为DATE
  • 在计算列上添加唯一索引。

这样的东西
CREATE TABLE records (
  created_at DATETIME
  , created_at_date AS DATE(created_at)
  , ...
)

CREATE UNIQUE INDEX UIX_RECORDS_CREATED_AT_DATE ON Records (created_at_date)

答案 1 :(得分:1)

如果比较接近,第二个肯定更好。 在第一个变体中,DATE(somefield)阻止优化器使用任何索引。因此在第一个变体中 - mysql将扫描整个表。

BTW:他们不是平等的查询。第一个选择'02 -02-2012',第二个选择2和3 feb。

但是。如果你需要避免重复,两种变体都不合适。使用唯一索引。

答案 2 :(得分:0)

第二种不太可能触发表扫描(当然,假设您已编入索引created_at)。

每当你在检查它之前对某个列做一些事情(除非服务器足够聪明,意识到它不必经常,而这通常不是),那么必须对每一行的值进行处理。在测试之前。这意味着需要检查表中的每一行。如果您在created_at上有索引,服务器可能会忽略它。