lunes, 1 de agosto de 2011

ORs en MySQL 4 vs MySQL 5

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:

CREATE TABLE `test_ors` (
  `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 |
+----+-------------+----------+-------------+--------------------+--------------------+---------+------+------+----------------------------------------------+


Ahora sí se usan índices, y ni más ni menos que los dos (PRIMARY,SECUNDARIO).

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.

Tabletas multiusuario, ¿para cuándo?

Antes que nada quiero decir que no soy usuario de tablets.
No es por nada, sino porque no le veo la utilidad para mi trabajo diario ni tampoco le veo utilidad en casa. Prefiero mi teclado físico que no se me coma casi la mitad de la pantalla y no tener dolor en el brazo que sujeta el dispositivo mientras con el otro intento teclear en un teclado pensado por gente que piensa que la usabilidad sólo es algo "cool".

Algunos vienen diciendo desde hace tiempo que las tablets sustituirán a los netbooks y quizá no les falte razón, aunque creo que todavía tienen, para mi gusto, mucho camino por recorrer. Uno de ellos es el de entorno multiusuario.

Con esto me refiero a que si yo me compro una tablet, tengo mi correo de gmail, el correo de mi empresa, mi correo de terra, yahoo, hotmail, mi cuenta de youtube, picasa, etc .... cuando mi hijo, mi mujer, el abuelo o en última instancia el hamster quieran ver su cuenta de correo, videos, streaming, etc .... ¿necesitarán otra tablet?

Este tema lleva resuelto hace muuuuucho tiempo en otros dispositivos así que señores fabricantes de tablets... hagan el favor de hacer un poco menos inútil una tablet ;-).. ¿Cómo que no pueden? ... mmm Android es un fork de Linux (multiusuario desde sus inicios)... IOS es un fork de BSD (multiusuario desde sus inicios y con la misma raiz que Linux),  Windows es un sistema operativo multi-bug ;-) y también multiusuario...

Así que a aquellos que vienen vaticinando el fracaso de los netbooks en pro de las tablets les diré que ... cuidado que viene el lobo... pero ojo, que el lobo está cojo y bizco, así que me esperaré al lobo versión 20.0 a ver si realmente es tan fiero como lo pintan porque hasta ahora sólo es muy "cool" ;-)