Jak wiadomo, podstawą wydajnej pracy bazy danych są odpowiednio dobrane indeksy. Niestety, to nie wystarczy. Bardzo częstym błędem, popełnianym nawet przez doświadczonych programistów, jest stosowanie w warunku WHERE funkcji działającej na wartości kolumny. O co dokładnie chodzi ilustruje podany niżej przykład. Zakładamy tabelę o następującej strukturze:
mysql> SHOW CREATE TABLE tab1\G
*************************** 1. row ***************************
Table: tab1
Create Table: CREATE TABLE `tab1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` int(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3102 DEFAULT CHARSET=latin2
1 row in set (0,00 sec)
*************************** 1. row ***************************
Table: tab1
Create Table: CREATE TABLE `tab1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` int(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3102 DEFAULT CHARSET=latin2
1 row in set (0,00 sec)
Kolumna `timestamp`, jak sama nazwa wskazuje, przechowuje datę w postaci uniksowego timestampa. Załóżmy, że w wyniku zapytania chcemy dostać tylko te rekordy, których timestamp jest późniejszy niż 2 stycznia 2004 roku. Sprawdzamy jak wygląda plan takiego zapytania:
mysql> EXPLAIN SELECT * FROM tab1 WHERE FROM_UNIXTIME(timestamp) >= '2004-01-02 00:00:00';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | tab1 | ALL | NULL | NULL | NULL | NULL | 3101 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0,00 sec)
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | tab1 | ALL | NULL | NULL | NULL | NULL | 3101 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0,00 sec)