T&B <[EMAIL PROTECTED]> wrote: > Hi RBS, > > > - indexes that include all possible combinations of fields that may > > appear > > in a WHERE clause. > > As an aside, note that, AFAIK, indexes are only used: > > 1. To get the first match of a query. If you ask for more than one > matching record, the second, third etc matches are found by searching, > not through the index.
No. If an index is used to retrieve the first row in the result, then it continues to be used for every row. Depending on the query, it is often possible to not have to do a full binary search of the index on the second and subsequent rows. Instead, the next matching index entry might be adjacent to the previous one so finding the next value might be as simple as moving one index entry to the left or to the right. But whether or not you can do this depends on the query. And the index is still used for every row, regardless. > > 2. From left to right in the same order as your index. So if you > create index MyIndex on MyTable ( Column1, Column2, Column3 ), then > you must test them in the same order, eg: where Column1 = Value1 and > Column2 = Value2 or Column3 = Value3. If you miss a column in the > sequence or place one out of order, the index won't be used from that > point in the test onwards. The order of terms in a WHERE clause make no difference. All of the following work the same: WHERE column1=1 AND column2=2 AND column3=3 WHERE 2=column2 AND column3=3 AND column1=1 WHERE column2=2 AND 1=column1 AND column3=3 WHERE 3=column3 AND 2=column2 and 1=column1 WHERE column3=3 AND column1=1 AND 2=column2 WHERE 1=column2 AND column3=3 AND column2=2 Notice also that A=B is the same as B=A. But it is the case that you must cover some prefix of terms from the index. So if the index is on column1,column2,column3 in that order, and if you say: WHERE column1=1 AND column2!=7 AND column3=3 Then only the first term (column1) will be used by the index because you cannot use an index on a != operator. If you say WHERE column1!=7 AND column2=2 AND column3=3 Then the index cannot be used at all. If you say: WHERE column1=1 AND column2>3 AND column3=3 Then the first two terms of the index will be used. Each index can use at most one inequality operator and it must be on the right-most column of the index that gets used. > > 3. In equality tests, eg "=" (equals) and "in". If you use "like" for > comparison, the index isn't used. The last test (only) may be one or > two inequality tests, such as ">" or "<". And that last test must be > in sequence (ie rule 2). > http://www.sqite.org/optoverview.html -- D. Richard Hipp <[EMAIL PROTECTED]> ----------------------------------------------------------------------------- To unsubscribe, send email to [EMAIL PROTECTED] -----------------------------------------------------------------------------