This optimization improves the efficiency of a direct comparison
        between a nonindexed column and a constant. In such cases, the
        condition is “pushed down” to the storage engine
        for evaluation. In MySQL 5.1, this optimization can
        be used only by the NDBCLUSTER
        storage engine, but we intend to implement it for additional
        storage engines in future versions of MySQL.
      
For MySQL Cluster this optimization can eliminate the need to send nonmatching rows over the network between the cluster's data nodes and the MySQL Server that issued the query, and can speed up queries where it is used by a factor of 5 to 10 times over cases where condition pushdown could be but is not used.
Suppose that a MySQL Cluster table is defined as follows:
CREATE TABLE t1 (
    a INT,
    b INT,
    KEY(a)
) ENGINE=NDBCLUSTER;
Condition pushdown can be used with a query against this table such as the query shown here:
SELECT a,b FROM t1 WHERE b = 10;
        This can be seen in the output of
        EXPLAIN
        SELECT:
      
mysql> EXPLAIN SELECT a,b FROM t1 WHERE b = 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10
        Extra: Using where with pushed condition
However, condition pushdown cannot be used with either of these two queries:
SELECT a,b FROM t1 WHERE a = 10; SELECT a,b FROM t1 WHERE b + 1 = 10;
        With regard to the first of these two queries, condition
        pushdown is not applicable because an index exists on column
        a. (An index access method would be more
        efficient and so would be chosen in preference to condition
        pushdown.) In the case of the second query, condition pushdown
        cannot be employed because the comparison involving the
        nonindexed column b is indirect. (However,
        condition pushdown could be applied if you were to reduce
        b + 1 = 10 to b = 9 in the
        WHERE clause.)
      
        Condition pushdown may also be employed when an indexed column
        is compared with a constant using a > or
        < operator:
mysql> EXPLAIN SELECT a,b FROM t1 WHERE a<2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
         type: range
possible_keys: a
          key: a
      key_len: 5
          ref: NULL
         rows: 2
        Extra: Using where with pushed condition
Other comparisons which are supported for condition pushdown include the following:
              column [NOT] LIKE
              pattern
              pattern must be a string
              literal containing the pattern to be matched; for syntax,
              see Section 11.4.1, “String Comparison Functions”.
            
              column IS [NOT]
              NULL
              column IN
              (value_list)
              Each item in the value_list
              must be a constant, literal value.
            
              column BETWEEN
              constant1 AND
              constant2
              constant1 and
              constant2 must each be a
              constant, literal value.
            
In all of the cases in the preceding list, it is possible for the condition to be converted into the form of one or more direct comparisons between a column and a constant.
        Condition pushdown capability is not used by default. To enable
        it, you can start mysqld with the
        --engine-condition-pushdown
        option, or you can execute either of the following statements at
        runtime:
SET engine_condition_pushdown=ON;
SET engine_condition_pushdown=1;
Limitations. Condition pushdown is subject to the following limitations:
                In MySQL 5.1, condition pushdown is
                supported by the NDBCLUSTER
                storage engine only.
              
Columns may be compared with constants only; however, this includes expressions which evaluate to constant values.
                Columns used in comparisons cannot be of any of the
                BLOB or
                TEXT types.
              
A string value to be compared with a column must use the same collation as the column.
                Joins are not directly supported; conditions involving
                multiple tables are pushed separately where possible.
                Use EXPLAIN
                EXTENDED to determine which conditions are
                actually pushed down.
              


User Comments
Add your own comment.