【问题标题】:How to optimize SQLite database fetching time如何优化 SQLite 数据库获取时间
【发布时间】:2014-07-25 06:16:44
【问题描述】:

我的数据库有 6384 条记录,我正在使用以下查询:

SELECT T.t_name, S.s_code, S.s_name, R.s_code, R.s_name, M.arrival_time, L.arrival_time, M.dest_time, M.train_id, S.id, R.id
FROM TRAIN_SCHEDULE M,
     TRAIN_SCHEDULE L,
     TRAIN T,
     STATION S,
     STATION R
WHERE S.s_name = 'Versova'
  AND R.s_name = 'Ghatkopar'
  AND M.arrival_time > '00:00:00'
  AND M.arrival_time < L.arrival_time
  AND M.train_id = L.train_id
  AND M.dest_time = L.dest_time
  AND T.id = M.train_id
  AND S.id = M.station_id
  AND R.id = L.station_id

此查询需要 8 秒来获取数据。 我还索引了我的表,但提取时间减少到只有 2 秒。

架构:

CREATE TABLE [STATION] (
  [id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  [s_code] VARCHAR(10) NOT NULL,
  [s_name] VARCHAR(50) NOT NULL);
CREATE TABLE TRAIN_SCHEDULE(
  id INT,
  station_id INT,
  train_id INT,
  arrival_time NUM,
  departure_time NUM,
  dest_time NUM
);
CREATE TABLE TRAIN(id INT,t_name TEXT);
CREATE INDEX idx_arrival_time ON train_schedule (arrival_time);
CREATE INDEX idx_dest_time ON train_schedule (dest_time);
CREATE INDEX idx_id ON train (id);

我该如何改进?

【问题讨论】:

    标签: android ios database sqlite query-optimization


    【解决方案1】:

    您可以通过EXPLAIN QUERY PLAN 检查正在使用哪些索引。

    在这个查询中,数据库需要扫描STATION表; name 列上的索引会改善这一点(尽管对于这么小的表来说效果不大):

    CREATE INDEX Station_Name ON STATION(s_name);
    

    此外,TRAIN_SCHEDULE 表的查找是在多个列上完成的。 查询优化器每个表实例不能使用多个索引,因此您应该创建一个多列索引。 并且具有不相等比较的列必须放在最后(请参阅documentation):

    CREATE INDEX Schedule_Station_Train_DestTime_ArrivalTime
      ON TRAIN_SCHEDULE(station_id, train_id, dest_time, arrival_time);
    

    同时执行一次ANALYZE 以帮助优化器选择正确的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2013-03-10
      • 2013-07-01
      • 2018-01-30
      • 1970-01-01
      • 2015-11-19
      • 2021-04-05
      相关资源
      最近更新 更多