DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) is-null-optimization

Info Catalog (mysql.info) index-merge-optimization (mysql.info) query-speed (mysql.info) distinct-optimization
 
 7.2.7 `IS NULL' Optimization
 ----------------------------
 
 MySQL can perform the same optimization on COL_NAME `IS NULL' that it
 can use for COL_NAME `=' CONSTANT_VALUE.  For example, MySQL can use
 indexes and ranges to search for `NULL' with `IS NULL'.
 
 Examples:
 
      SELECT * FROM TBL_NAME WHERE KEY_COL IS NULL;
 
      SELECT * FROM TBL_NAME WHERE KEY_COL <=> NULL;
 
      SELECT * FROM TBL_NAME
        WHERE KEY_COL=CONST1 OR KEY_COL=CONST2 OR KEY_COL IS NULL;
 
 If a `WHERE' clause includes a COL_NAME `IS NULL' condition for a
 column that is declared as `NOT NULL', that expression is optimized
 away. This optimization does not occur in cases when the column might
 produce `NULL' anyway; for example, if it comes from a table on the
 right side of a `LEFT JOIN'.
 
 MySQL can also optimize the combination `COL_NAME = EXPR AND COL_NAME
 IS NULL', a form that is common in resolved subqueries.  `EXPLAIN'
 shows `ref_or_null' when this optimization is used.
 
 This optimization can handle one `IS NULL' for any key part.
 
 Some examples of queries that are optimized, assuming that there is an
 index on columns `a' and `b' of table `t2':
 
      SELECT * FROM t1 WHERE t1.a=EXPR OR t1.a IS NULL;
 
      SELECT * FROM t1, t2 WHERE t1.a=t2.a OR t2.a IS NULL;
 
      SELECT * FROM t1, t2
        WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;
 
      SELECT * FROM t1, t2
        WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);
 
      SELECT * FROM t1, t2
        WHERE (t1.a=t2.a AND t2.a IS NULL AND ...)
        OR (t1.a=t2.a AND t2.a IS NULL AND ...);
 
 `ref_or_null' works by first doing a read on the reference key, and
 then a separate search for rows with a `NULL' key value.
 
 Note that the optimization can handle only one `IS NULL' level. In the
 following query, MySQL uses key lookups only on the expression
 `(t1.a=t2.a AND t2.a IS NULL)' and is not able to use the key part on
 `b':
 
      SELECT * FROM t1, t2
        WHERE (t1.a=t2.a AND t2.a IS NULL)
        OR (t1.b=t2.b AND t2.b IS NULL);
 
Info Catalog (mysql.info) index-merge-optimization (mysql.info) query-speed (mysql.info) distinct-optimization
automatically generated byinfo2html