代码之家  ›  专栏  ›  技术社区  ›  Georg Schölly Crazy Developer

多列索引是否也适用于单列选择?

  •  39
  • Georg Schölly Crazy Developer  · 技术社区  · 16 年前

    CREATE INDEX someIndex ON orders (customer, date);
    

    该索引是否仅在以下情况下加速查询 客户和日期

    SELECT * FROM orders WHERE customer > 33;
    

    我正在使用SQLite。


    如果答案是肯定的,为什么每个表可以创建多个索引?


    还有一个问题:当在查询中同时使用两列时,组合索引比两个独立索引快多少?

    3 回复  |  直到 16 年前
        1
  •  44
  •   Jared Miller    16 年前

    marc_s对你的第一个问题有正确的答案。多键索引中的第一个键可以像单个键索引一样工作,但任何后续键都不会。

    至于复合索引的速度有多快,则取决于您的数据以及您如何构造索引和查询,但这通常很重要。索引本质上允许Sqlite对字段进行二进制搜索。

    SELECT * from orders where customer > 33 && date > 99
    

    Sqlite将首先对整个表使用二进制搜索获得所有结果,其中customer>33然后它将只对那些查找日期的结果进行二进制搜索>99

    因此,速度提高的程度取决于如何根据查询构造索引。理想情况下,索引和查询中的第一个字段应该是消除最可能的匹配的字段,因为这样可以大大减少第二次搜索所需的工作量,从而最大限度地提高速度。

    有关更多信息,请参见: http://www.sqlite.org/optoverview.html

        2
  •  6
  •   marc_s    16 年前

    马克

        3
  •  3
  •   whardier    14 年前

    我通常使用组合索引对我希望分页或请求的数据进行排序。

    sqlite> CREATE INDEX customer_asc_date_asc_index_asc ON orders
              (customer ASC, date ASC, id ASC);
    

    sqlite> SELECT id, customer, date FROM orders
              ORDER BY customer ASC, date ASC, id ASC LIMIT 10;
    
    2653|1|1303828585
    2520|1|1303828713
    2583|1|1303829785
    1828|1|1303830446
    1756|1|1303830540
    1761|1|1303831506
    2442|1|1303831705
    2523|1|1303833761
    2160|1|1303835195
    2645|1|1303837524
    

    sqlite> SELECT id, customer, date FROM orders WHERE
              (customer = 1 AND date = 1303837524 and id > 2645) OR
              (customer = 1 AND date > 1303837524) OR
              (customer > 1)
              ORDER BY customer ASC, date ASC, id ASC LIMIT 10;
    
    2515|1|1303837914
    2370|1|1303839573
    1898|1|1303840317
    1546|1|1303842312
    1889|1|1303843243
    2439|1|1303843699
    2167|1|1303849376
    1544|1|1303850494
    2247|1|1303850869
    2108|1|1303853285
    

    等等

    在使用查询偏移量加上限制时,索引就位可以减少服务器端索引扫描。偏移量越高,查询时间越长,驱动器搜索越困难。使用这种方法可以消除这种情况。