0

我将 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 中缺少一些技巧,我会很高兴听到它们。

祝一切顺利。

4

2 回答 2

1

当您在索引列上使用函数时,SQLite 不能使用索引,因为该函数可能不保留排序 - 即可以有诸如1>2, 但是之类的函数F(1)<F(2)。不过,有一些方法可以解决这种情况:

  1. 如果要使用索引使查询更快,则必须将值保存为固定大小写(大写或小写),然后仅将查询参数转换为相同大小写:
SELECT count(*) as 'test'
FROM my_table
WHERE surname = LOWER('Oliver')
  1. 您可以使用不区分大小写的 LIKE 运算符(我不知道索引是如何受到影响的!):
SELECT count(*) as 'test'
FROM my_table
WHERE surname LIKE 'Oliver';
  1. 或者您可以将每一列创建为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运算符的更多信息。

于 2012-10-03T15:26:43.530 回答
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;
于 2012-10-03T15:41:14.327 回答