2016-01-13 59 views
1

我有这个sqlite查询大约11k记录的返回数据集。此查询中是否存在可以帮助提升性能的范围。由于增强select性能sqlite查询的性能

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)) 
+0

你如何比较东数和数字和字符串? – sagi

+1

显示表结构,您拥有的任何索引以及[EXPLAIN QUERY PLAN](http://www.sqlite.org/eqp.html)的输出。 –

+0

@CL。这是一个错误,它总是会变成小数。无论如何,这里是表结构 –

回答

0

你有一个索引为它创建的?我猜想最具辨别性的列是site,所以你需要一个以此开始的索引。

此外,你有一个covering index它吗?你只是读三列和测试从一个相当宽的表比较多,所以覆盖索引可以帮助在这里:

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

该指数是“覆盖”,因为它包含所有查询需要。

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