Indeed would seem so. Remove the primary key and idx_test is used. This is on 3.7.16.2
CREATE TABLE test( id INTEGER, class INTEGER NOT NULL); CREATE INDEX idx_test ON TEST(class,id); EXPLAIN QUERY PLAN SELECT * FROM test WHERE id IN (0,1) AND class IN (3,4); 0|0|0|SEARCH TABLE test USING COVERING INDEX idx_test (class=? AND id=?) (~36 rows) 0|0|0|EXECUTE LIST SUBQUERY 1 0|0|0|EXECUTE LIST SUBQUERY 1 -----Original Message----- From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Richard Hipp Sent: Friday, May 17, 2013 9:37 AM To: General Discussion of SQLite Database Subject: Re: [sqlite] Problem with index on multiple columns On Fri, May 17, 2013 at 10:26 AM, Konstantinos Alogariastos < marau...@gmail.com> wrote: > I am already aware of the contents of the query planner documentation. > > As you say, only one b-tree index will be used. What I want to achieve > is what is described in the documentation " *The second column is used > to break ties in the left-most column* ". > > In my case, my custom index "idx_test(class,id)" should first search > in the "class" column and if there are any ties there (which happens a > lot in my case), the "id" column should be used to break them. > However, as evidenced by the query plan output, only the "class" > column is used for indexing. > Collating orders and affinities might be disqualifying the constraint on "id" from being used with the index. > > > Best regards, > > Kostas > > > On May 17, 2013, at 10:54 AM, Konstantinos Alogariastos <marauber at > gmail.com <http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users>> > wrote: > > >* Does this mean that one cannot use a index on two columns when in the > query*>* both columns are used with "IN"?* > You might want to read up on the query planner: > http://www.sqlite.org/queryplanner.html#searching > > The short of it: only one btree index will be used per source table. > > >* Is this a limitation of SQLite or a bug?* > Neither. But read up on Multi-Column Indices. > > There exist other types of indexes (for example bitmap indexes [1]), > which have different properties and can be combined to resolve a > query, but such structures are not supported by SQLite. > > [1] http://en.wikipedia.org/wiki/Bitmap_index > > > > 2013/5/17 Konstantinos Alogariastos <marau...@gmail.com> > > > Hi all, > > > > I am using SQLite 3.7.13 and I am experiencing a problem with using an > > index on multiple columns. > > > > Let's assume the following example: > > I have a simple table constructed as such: > > > > CREATE TABLE test( > > id INTEGER PRIMARY KEY AUTOINCREMENT, > > class INTEGER NOT NULL); > > > > and I insert some data to it. > > > > Next I create an index: CREATE INDEX idx_test ON TEST(class,id); > > > > If I try to use the index with a query similar to the following: > > EXPLAIN QUERY PLAN > > SELECT * > > FROM test > > WHERE id IN (0,1) > > AND class IN (3,4) > > > > I get the output: > > 0|0|0|SEARCH TABLE test USING INTEGER PRIMARY KEY (rowid=?) (~2 rows) > > 0|0|0|EXECUTE LIST SUBQUERY 1 > > 0|0|0|EXECUTE LIST SUBQUERY 1 > > > > (which means my index is not used) > > > > If I add "INDEXED BY idx_test" on the above query, I get: > > 0|0|0|SEARCH TABLE test USING COVERING INDEX idx_test (class=?) (~2 rows) > > 0|0|0|EXECUTE LIST SUBQUERY 1 > > 0|0|0|EXECUTE LIST SUBQUERY 1 > > > > which shows that only one column of the index is used for indexing. This > > has the side effect of the query taking longer than it should be. > > Modifying the order of the columns on the index or in the query didn't > > help either. > > > > Does this mean that one cannot use a index on two columns when in the > > query both columns are used with "IN"? > > Is this a limitation of SQLite or a bug? > > > > Thanks in advance. > > > > Best regards, > > Kostas > > > > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users