2016-01-13 28 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是主鍵,但它使優化器更明顯,它不需要讀取其他任何東西。