我有一个相当大的表(几千条记录),并且不能确保在同一天不能创建重复项。
任何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';
答案 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
上有索引,服务器可能会忽略它。