DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info.gz) Range access multi-part

Info Catalog (mysql.info.gz) Range access single-part (mysql.info.gz) Range optimization
 
 7.2.5.2 Range Access Method for Multiple-Part Indexes
 .....................................................
 
 Range conditions on a multiple-part index are an extension of range
 conditions for a single-part index.  A range condition on a
 multiple-part index restricts index records to lie within one or
 several key tuple intervals. Key tuple intervals are defined over a set
 of key tuples, using ordering from the index.
 
 For example, consider a multiple-part index defined as `key1(KEY_PART1,
 KEY_PART2, KEY_PART3)', and the following set of key tuples listed in
 key order:
 
      KEY_PART1  KEY_PART2  KEY_PART3
        NULL       1          'abc'
        NULL       1          'xyz'
        NULL       2          'foo'
         1         1          'abc'
         1         1          'xyz'
         1         2          'abc'
         2         1          'aaa'
 
 The condition `KEY_PART1 = 1' defines this interval:
 
      (1, -inf, -inf) <= (KEY_PART1, KEY_PART2, KEY_PART3) < (1, +inf, +inf)
 
 The interval covers the 4th, 5th, and 6th tuples in the preceding data
 set and can be used by the range access method.
 
 By contrast, the condition `KEY_PART3 = 'abc'' does not define a single
 interval and cannot be used by the range access method.
 
 The following descriptions indicate how range conditions work for
 multiple-part indexes in greater detail.
 
    * For `HASH' indexes, each interval containing identical values can
      be used.  This means that the interval can be produced only for
      conditions in the following form:
 
               KEY_PART1 CMP CONST1
           AND KEY_PART2 CMP CONST2
           AND ...
           AND KEY_PARTN CMP CONSTN;
 
      Here, CONST1, CONST2, ... are constants, CMP is one of the `=',
      `<=>', or `IS NULL' comparison operators, and the conditions cover
      all index parts. (That is, there are N conditions, one for each
      part of an N-part index.)
 
      See  Range access single-part for the definition of what is
      considered to be a constant.
 
      For example, the following is a range condition for a three-part
      `HASH' index:
 
           KEY_PART1 = 1 AND KEY_PART2 IS NULL AND KEY_PART3 = 'foo'
 
    * For a `BTREE' index, an interval might be usable for conditions
      combined with `AND', where each condition compares a key part with
      a constant value using `=', `<=>', `IS NULL', `>', `<', `>=',
      `<=', `!=', `<>', `BETWEEN', or `LIKE 'PATTERN'' (where
      `'PATTERN'' doesn't start with a wildcard).  An interval can be
      used as long as it is possible to determine a single key tuple
      containing all records that match the condition (or two intervals
      if `<>' or `!=' is used).  For example, for this condition:
 
           KEY_PART1 = 'foo' AND KEY_PART2 >= 10 AND KEY_PART3 > 10
 
      The single interval will be:
 
           ('foo', 10, 10)
              < (KEY_PART1, KEY_PART2, KEY_PART3)
                 < ('foo', +inf, +inf)
 
      It is possible that the created interval will contain more records
      than the initial condition.  For example, the preceding interval
      includes the value `('foo', 11, 0)', which does not satisfy the
      original condition.
 
    * If conditions that cover sets of records contained within
      intervals are combined with `OR', they form a condition that
      covers a set of records contained within the union of their
      intervals. If the conditions are combined with `AND', they form a
      condition that covers a set of records contained within the
      intersection of their intervals.  For example, for this condition
      on a two-part index:
 
           (KEY_PART1 = 1 AND KEY_PART2 < 2)
           OR (KEY_PART1 > 5)
 
      The intervals will be:
 
           (1, -inf) < (KEY_PART1, KEY_PART2) < (1, 2)
           (5, -inf) < (KEY_PART1, KEY_PART2)
 
      In this example, the interval on the first line uses one key part
      for the left bound and two key parts for the right bound. The
      interval on the second line uses only one key part. The `key_len'
      column in the `EXPLAIN' output indicates the maximum length of the
      key prefix used.
 
      In some cases, `key_len' may indicate that a key part was used, but
      that might be not what you would expect.  Suppose that KEY_PART1
      and KEY_PART2 can be `NULL'.  Then the `key_len' column will
      display two key part lengths for the following condition:
 
           KEY_PART1 >= 1 AND KEY_PART2 < 2
 
      But in fact, the condition will be converted to this:
 
           KEY_PART1 >= 1 AND KEY_PART2 IS NOT NULL
 
 
  Range access single-part describes how optimizations are
 performed to combine or eliminate intervals for range conditions on
 single-part index.  Analogous steps are performed for range conditions
 on multiple-part keys.
 
Info Catalog (mysql.info.gz) Range access single-part (mysql.info.gz) Range optimization
automatically generated byinfo2html