我正在使用sqlite进行小型验证应用程序。我有一个简单的一个表数据库,包含4个varhchar列和一个整数主键。表中有近100万行。我对它进行了优化并对其进行了真空处理。
我使用以下查询从表中检索存在计数。我已经更改了隐私的字段和名称。
SELECT
count(*) as 'test'
FROM
my_table
WHERE
LOWER(surname) = LOWER('Oliver')
AND
UPPER(address_line2) = UPPER('Somewhere over the rainbow')
AND
house_number IN ('3','4','5');
此查询大约需要1.5-1.9秒才能运行。我已经尝试了索引,它们确实没有任何区别。这个时间可能听起来不错但我必须在csv文件中读取大约40,000次这个测试,所以你可以想象它会很快加起来。关于如何减少执行时间的任何想法。我通常在mssql或mysql中开发,所以如果在sqlite中我缺少一些技巧,我会很高兴听到它们。
一切顺利。
答案 0 :(得分:1)
当您在索引列上使用函数时,SQLite无法使用索引,因为该函数可能无法保留排序 - 即可能存在1>2
但F(1)<F(2)
等函数。但是有一些方法可以解决这种情况:
SELECT count(*) as 'test'
FROM my_table
WHERE surname = LOWER('Oliver')
SELECT count(*) as 'test'
FROM my_table
WHERE surname LIKE 'Oliver';
text collate nocase
,并且不再担心此列的案例差异:CREATE TABLE my_table (surname text collate nocase, <... other fields here ...>);
SELECT count(*) as 'test'
FROM my_table
WHERE surname ='Oliver';
您可以找到有关=
和LIKE
运营商here的更多信息。
答案 1 :(得分:1)
SELECT
count(1) as 'test'
FROM
my_table
WHERE
surname = 'Oliver'
AND
address_line2 = 'Somewhere over the rainbow'
AND
house_number IN ('3','4','5')
COLLATE NOCASE;