Summary: in this tutorial, you will learn how to optimize queries that involve the IS NULL condition.
Setting up table structure and index
Before optimizing queries that involve the IS NULL, you need to have an index on the column that you intend to use with the IS NULL condition because indexing can significantly enhance the query performance.
First, create a table called persons with three columns id, name, and age:
CREATE TABLE persons (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
INDEX age_index (age)
);The persons table has an index on the age column with the name age_index.
Second, insert some rows into the persons table:
INSERT INTO persons (id, name, age)
VALUES
(1, 'John Doe', 30),
(2, 'Jane Smith', NULL),
(3, 'Michael Johnson', 35),
(4, 'Sarah Williams', 28),
(5, 'Robert Brown', NULL),
(6, 'Emily Davis', 29),
(7, 'David Lee', NULL),
(8, 'Olivia Clark', 24),
(9, 'James Taylor', 31),
(10, 'Emma Anderson', 27);Code language: PHP (php)MySQL IS NULL optimization example
The following query retrieves rows from the persons table with the values in the age column are NULL:
SELECT * FROM persons
WHERE age IS NULL;Code language: PHP (php)Output:
+----+--------------+------+
| id | name | age |
+----+--------------+------+
| 2 | Jane Smith | NULL |
| 5 | Robert Brown | NULL |
| 7 | David Lee | NULL |
+----+--------------+------+
3 rows in set (0.02 sec)
Code language: PHP (php)MySQL uses the index when it searches for NULL with the IS NULL operator as shown in the following EXPLAIN query:
EXPLAIN
SELECT
*
FROM
persons
WHERE
age IS NULL;Code language: SQL (Structured Query Language) (sql)Output:
+----+-------------+---------+------------+------+---------------+-----------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+-----------+---------+-------+------+----------+-----------------------+
| 1 | SIMPLE | persons | NULL | ref | age_index | age_index | 5 | const | 3 | 100.00 | Using index condition |
+----+-------------+---------+------------+------+---------------+-----------+---------+-------+------+----------+-----------------------+
1 row in set, 1 warning (0.02 sec)Code language: JavaScript (javascript)MySQL can also optimize for the combination col = value OR col IS NULL, see the following example:
EXPLAIN
SELECT
*
FROM
persons
WHERE
age = 12
OR age IS NULL;
Code language: SQL (Structured Query Language) (sql)Output:
+----+-------------+---------+------------+-------------+---------------+-----------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+-------------+---------------+-----------+---------+-------+------+----------+-----------------------+
| 1 | SIMPLE | persons | NULL | ref_or_null | age_index | age_index | 5 | const | 4 | 100.00 | Using index condition |
+----+-------------+---------+------------+-------------+---------------+-----------+---------+-------+------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)Code language: JavaScript (javascript)In this example, the EXPLAIN shows ref_or_null when the optimization is applied.
Sometimes, MySQL might not effectively use indexes with complex OR conditions. For example:
EXPLAIN
SELECT
*
FROM
persons
WHERE
name = "Jane Smith"
OR age IS NULL;Code language: SQL (Structured Query Language) (sql)In this example, MySQL could not leverage the index:
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | persons | NULL | ALL | age_index | NULL | NULL | NULL | 10 | 19.00 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)Code language: PHP (php)Summary
- MySQL searches for an index on the column that uses the IS NULL to optimize the query.