增强 select sqlite 查询的性能

Posted

技术标签:

【中文标题】增强 select sqlite 查询的性能【英文标题】:enhancing a select sqlite query for performance 【发布时间】:2016-01-13 10:18:14 【问题描述】:

我在这个 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))

【问题讨论】:

您如何将东东与数字和字符串进行比较? 显示表结构、所有索引以及EXPLAIN QUERY PLAN 的输出。 @CL。对,这是一个错误,它总是会是小数。这是表格结构 您添加了表结构,但没有添加 EXPLAIN QUERY PLAN 【参考方案1】:

您是否为它创建了索引?我想最有区别的列是site,所以你需要一个以它开头的索引。

此外,您有covering index 吗?您只读取三列并从相当宽的表中再测试一列,因此覆盖索引可以在这里提供帮助:

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

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

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

【讨论】:

以上是关于增强 select sqlite 查询的性能的主要内容,如果未能解决你的问题,请参考以下文章

使用 UNION 增强来自多个表的插入查询的性能

SQLite3 使用索引查询列的任何子集

SQLite INSERT 和 DELETE 查询给出错误,但不是 SELECT 查询

Sqlite - 一对多关系 SELECT 查询

SQLite3-我怎样才能加快这个 SELECT 查询?

SQLite SELECT MAX() 查询返回 null 到游标?