首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化数据库调用

问优化数据库调用
EN

Stack Overflow用户
提问于 2010-06-17 10:21:26
回答 3查看 144关注 0票数 6

我有一个数据库,里面装满了电影的信息,这些信息(依次)从with服务器上的XML文件读取到数据库中。

发生的情况如下:

代码语言:javascript
复制
Gather/Parse XML and store film info as objects
Begin Statement
For every film object we found:
    Check to see if record for film exists in database
    If no film record, write data for film
Commit Statement

目前,我只是使用(最基本的)来测试一个电影的存在:

代码语言:javascript
复制
SELECT film_title FROM film WHERE film_id = ?

如果返回一行,则电影存在,如果不存在,则我需要添加它...

我也尝试过使用

代码语言:javascript
复制
INSERT INTO film (film_id, film_title, film_mStar, film_dStar, film_date) SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM film WHERE film_id = ?)

在处理时间上达到完全相同的效果...

唯一的问题是,数据库中有成百上千条记录(很多电影!)因为它必须在写入之前检查数据库中是否存在一部电影,所以整个过程会花费相当长的时间( 210部电影大约27秒)

有没有更有效的方法来做到这一点,或者只是一般的建议?

编程语言为Objective-C,数据库为sqlite3,平台为iPhone/iPad/iPodTouch

谢谢,Dwaine

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-17 11:49:58

您可以尝试在film_id上添加索引,以加快搜索现有电影的速度。

这样的代码应该可以完成这项工作:

代码语言:javascript
复制
CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)

如果您的惟一键实际上是其他键(不仅仅是film_id,还可能是title和year),那么您应该包括索引中使用的所有列。

票数 0
EN

Stack Overflow用户

发布于 2010-06-17 12:05:03

如果每部电影的film_id都是独一无二的,你可以考虑如下内容:

代码语言:javascript
复制
SELECT film_id FROM film;

在启动时,缓存数组或类似数组中的所有ids。然后,当从XML中读取新记录时,检查数组中是否存在film_id,如果不存在,则将其同时添加到数组和数据库中。这样,每个文件只选择一次,而不是每个胶片选择一次。

编辑:另一件需要考虑的事情是事务。启动时:

代码语言:javascript
复制
BEGIN TRANSACTION;

在您的所有插入之后:

代码语言:javascript
复制
COMMIT;
票数 0
EN

Stack Overflow用户

发布于 2010-06-17 12:50:07

为电影in创建一个布尔值数组(它可以只是一个位图),然后将数组中每个相应地址的位设置为false/true。然后,不使用sql检查它是否存在,而是根据数组检查它。插入时,将filmid = true添加到数组中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3058511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档