2015-04-03 44 views
0

这是我第一次使用sqlite,我写了一个简单的数据库来存储和检索地图图块。 这里是源码数据库:sqlite对地图图块执行速度很慢

CREATE TABLE IF NOT EXISTS Tiles (id INTEGER NOT NULL PRIMARY KEY, X INTEGER NOT NULL, Y INTEGER NOT NULL, Zoom INTEGER NOT NULL, Type INTEGER NOT NULL,Date TEXT) 

CREATE TABLE IF NOT EXISTS TilesData (id INTEGER NOT NULL PRIMARY KEY CONSTRAINT fk_Tiles_id REFERENCES Tiles(id) ON DELETE CASCADE, Tile BLOB NULL) 

CREATE TRIGGER fki_TilesData_id_Tiles_id BEFORE INSERT ON [TilesData] FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'insert on table TilesData violates foreign key constraint fki_TilesData_id_Tiles_id') WHERE (SELECT id FROM Tiles WHERE id = NEW.id) IS NULL; END 

CREATE TRIGGER fku_TilesData_id_Tiles_id BEFORE UPDATE ON [TilesData] FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'update on table TilesData violates foreign key constraint fku_TilesData_id_Tiles_id') WHERE (SELECT id FROM Tiles WHERE id = NEW.id) IS NULL; END 

CREATE TRIGGER fkdc_TilesData_id_Tiles_id BEFORE DELETE ON Tiles FOR EACH ROW BEGIN DELETE FROM TilesData WHERE TilesData.id = OLD.id; END 

下面是插入操作:

INSERT INTO Tiles(X, Y, Zoom, Type,Date) VALUES(?, ?, ?, ?,?); 
INSERT INTO TilesData(id, Tile) VALUES((SELECT last_insert_rowid()), ?); 

下面是读取操作:

SELECT Tile FROM TilesData WHERE id = (SELECT id FROM Tiles WHERE X=%1 AND Y=%2 AND Zoom=%3 AND Type=%4) 

的问题是,当数据库是小读取仍然非常快(大约20ms),但是当数据库变大(大约15000行)时,读取访问变得非常慢(大约4000ms)。 我做错了什么?任何改善表现的建议?

回答

2

如果你想为Android你也可以使用noSQL解决方案的速度。例如Couchbase

+0

可悲的是我在windows上工作... – Nyaruko 2015-04-03 06:54:43

+0

看看,nosql [MongoDB](https://www.mongodb.org/)速度超过SQL或其他SQL,对于实例MySQL来说, PostgreSQL,Oracle等SQlite专为少量数据而设计。 – 2015-04-03 06:59:34