我有一个包含超过200,000行的大表,在插入新行之前,我只需要检查最后几千行的重复项(不是全部)。目前我正在为我要添加的每一行运行此查询:
.all()
根据该查询的响应,如果响应为空,我会写入该行。
我这样做的问题是它需要很长时间,而且随着数据库的增长,这只会增加所需的时间。
我尝试使用SELECT ID from table where date='' and time=''
说LIMIT and OFFSET
我认为只会在200,000之后搜索行到数据库的末尾,但运行此查询似乎没有更快。
我的问题是:是否有更有效的方法在数据库中“跳过”而只搜索部分行而不是所有行?
答案 0 :(得分:1)
您应该使用INSERT IGNORE
,并根据应该唯一的列在表上使用UNIQUE约束。
使用INSERT IGNORE
时,MySQL会自动检测该行是否唯一,并忽略进入数据库的条目。有关详细信息,请参阅this question。
此外,只要您在表上拥有正确的索引,搜索数百万行数据库应该很快。您不需要搜索数据子集(没有键,数据库将被强制执行行扫描,这可能会导致您正在谈论的延迟)。