> On Dec 21, 2016, at 7:47 PM, Gelin Yan <dynami...@gmail.com> wrote:
> 
>  the json_extract part didn't work.
> 
> Query plan indicated "search table t_expr using index pid>? and pid<?"

That’s going to happen with any query like that; it doesn’t have anything to do 
with JSON or an index on an expression.

The index is sorted by `pid`, so the query can use the index to scan only the 
entries with `pid` in the right range. So far so good.

But the `$.index.id` values aren’t in order within the index! They’re only 
sorted _among entries with the same `pid`_. So there’s no possible shortcut 
using the secondary key; the query has to scan every single item within that 
`pid` range.

What you can do is swap the  priorities in the index:
        create index if not exists t_expr_idx1 on 
t_expr(json_extract(payload,'$.index.id’)), pid)

Now the query can scan the index starting at the desired `index.id` and minimum 
`pid`, and then scan forwards to the maximum `pid`.

The moral of the story is that, if your query has an equality test and an 
comparison or range test, the primary key of the index should be the 
column/expression being tested for equality.

—Jens
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to