Llevaba tiempo intentando hacer una prueba para ver si MySQL 5 había conseguido superar algunos problemillas de optimización que tiene MyQSL 4. En concreto el problema de optimización de índices cuando se realiza una consulta sobre dos índices distintos con una condición OR y he aquí el resultado.
Primero, la tabla:
`idtest_ors` int(11) NOT NULL AUTO_INCREMENT,
`text` varchar(45) DEFAULT NULL,
`id2` int(11) DEFAULT NULL,
PRIMARY KEY (`idtest_ors`),
KEY `SECUNDARIO` (`id2`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1 COMMENT='Database test';
Creada con dos índices, uno para cada campo sobre los que queremos buscar.
Después, la problemática prueba realizada sobre MySQL 4, habiendo insertado algunos datos de prueba.
mysql> explain SELECT * FROM `mydb`.`test_ors` WHERE (idtest_ors=3 OR id2=4);
+----+-------------+----------+------+--------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+--------------------+------+---------+------+------+-------------+
| 1 | SIMPLE | test_ors | ALL | PRIMARY,SECUNDARIO | NULL | NULL | NULL | 16 | Using where |
+----+-------------+----------+------+--------------------+------+---------+------+------+-------------+
Donde se puede ver que MySQL 4 no ha podido usar ningún índice (NULL) para hacer el filtrado.... ¡¡Ni siquiera uno!!
Por último, la prueba sobre MySQL 5, donde parece que lo que ha sido usado es el "truco" que se venía utilizando por los programadores que usaban MySQL 4, es decir, dividir la query en dos (una para cada índice) y unirla mediante UNION.
mysql> explain SELECT * FROM `mydb`.`test_ors` WHERE (idtest_ors=3 OR id2=4);
+----+-------------+----------+-------------+--------------------+--------------------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------------+--------------------+--------------------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | test_ors | index_merge | PRIMARY,SECUNDARIO | PRIMARY,SECUNDARIO | 4,5 | NULL | 3 | Using union(PRIMARY,SECUNDARIO); Using where |
+----+-------------+----------+-------------+--------------------+--------------------+---------+------+------+----------------------------------------------+
A primera vista parece una solución poco elaborada por parte de MySQL aunque efectiva :-) pero lo importante es que migrar de MySQL 4 a MySQL 5 tiene un aliciente más, y es el incremento de rendimiento si no hemos tenido cuidado de optimizar al máximo nuestras queries en MySQL 4.