增强select sqlite查询性能

时间:2016-01-13 10:18:15

标签: sqlite query-performance

我在此sqlite查询上有大约11k条记录的返回数据集。此查询中是否存在可以帮助提高性能的更改范围。感谢

SELECT count(*) as count, easting,northing FROM tableName where site='K' AND is_deleted=0 AND easting !='' AND northing !='' AND easting !=0 AND northing !=0.

这是我将拉记录的表结构:

CREATE TABLE "g_livcol" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,
"accession_no" INTEGER NOT NULL ,
"isLive" VARCHAR(5),
"taxanomic_name" VARCHAR(50),
"genus_name" VARCHAR(50),
"taxanomic_species" VARCHAR(50),
taxanomic_species2 VARCHAR(50),
taxon_is_epithet VARCHAR(50),
taxanomic_cv VARCHAR(50),
sec_key INTEGER,
site VARCHAR(5),
location_key VARCHAR(20),
sub_location1 INTEGER, 
sub_location2 INTEGER,
count_of_loc_key INTEGER,
accession_quantity INTEGER,
canopy INTEGER,
height INTEGER,
easting DOUBLE,
northing DOUBLE, 
created_at DATETIME,
updated_at DATETIME, 
is_deleted BOOL DEFAULT (0))

1 个答案:

答案 0 :(得分:0)

您是否为其创建了索引?我认为最具辨别力的列是site,因此您需要一个以此为开头的索引。

此外,你有covering index吗?您只需阅读三列并从相当宽的表中测试另一列,因此覆盖索引可以帮助:

create index tableName_i1 on tableName (site, is_deleted, easting, northing, id);

索引是“覆盖”,因为它包含查询所需的所有内容。

实际上,由于计数中的“*”,优化器可能没有意识到这一点,因此我建议使用count(id)而不是count(*)。它是相同的,因为id是主键,但它使优化器更明显,它不需要读取任何其他内容。