优化数据库调用

时间:2010-06-17 02:21:26

标签: objective-c database sqlite performance

我有一个充满电影信息的数据库,然后从网络服务器上的XML文件读入数据库。

以下是:

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

目前我只是使用(非常基本的)测试电影的存在:

SELECT film_title FROM film WHERE film_id = ?

如果返回一行,那么电影就存在,如果没有,那么我需要添加它......

我也尝试过使用

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

3 个答案:

答案 0 :(得分:0)

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

这样的事情应该可以胜任:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)

如果您的唯一键实际上是其他键(不仅仅是film_id,但可能是标题和年份),那么您应该包括您在索引中使用的所有列。

答案 1 :(得分:0)

如果film_id每部电影都是独一无二的,你可以考虑这样的事情:

SELECT film_id FROM film;
启动时

,并缓存数组或类似的所有ID。然后,当您从XML中读取新记录时,检查数组中是否存在film_id,如果不存在,则将其添加到数组和数据库中。这样你每个文件只能选择一次而不是每部电影一次。

编辑:要考虑的另一件事是交易。在启动时:

BEGIN TRANSACTION;

并在所有插入之后:

COMMIT;

答案 2 :(得分:0)

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