需要进行Sqlite查询优化

时间:2012-10-03 15:23:03

标签: sql database sqlite

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

一切顺利。

2 个答案:

答案 0 :(得分:1)

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

  1. 如果您想使用索引来加快查询速度,则必须保存 固定情况下的值(上限或下限)然后只转换 查询参数的情况相同:
  2. SELECT count(*) as 'test'
    FROM my_table
    WHERE surname = LOWER('Oliver')
    
    1. 您可以使用不区分大小写的LIKE运算符(我不知道索引是如何受到影响的!):
    2. SELECT count(*) as 'test'
      FROM my_table
      WHERE surname LIKE 'Oliver';
      
      1. 或者您可以将每列创建为text collate nocase,并且不再担心此列的案例差异:
      2. 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;