una tablas soporta segundo rapida por optimizar mas lento lentas lenta left inner hacer grandes cuello cuantas consultas consulta con como botella mysql join left-join inner-join

tablas - optimizar consultas lentas mysql



mysql: ¿por qué left join no usa un índice? (1)

Los dos campos relevantes para la unión no tenían exactamente el mismo tipo (varchar (255) con CHARACTER SET utf8 y varchar (128) con latin1). Definí tanto la misma longitud como el conjunto de caracteres, y ahora la consulta con LEFT JOIN funciona como se esperaba.

Me enfrento a un problema de rendimiento extraño con una consulta de mysql.

SELECT `pricemaster_products`.*, `products`.* FROM `pricemaster_products` LEFT JOIN `products` ON `pricemaster_products`.`ean` = `products`.`products_ean`

Quiero explícitamente usar una unión izquierda. Pero la consulta lleva mucho más tiempo de lo que debería.

Traté de cambiar la unión a un INNER JOIN. La consulta ahora es realmente rápida, pero el resultado no es lo que necesito.

Utilicé la explicación y llegué a la siguiente conclusión:

Si utilizo un "IZQUIERDA IZQUIERDA", una EXPLICACIÓN de los resultados de la consulta en ...

type: "ALL" possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 90.000 / 50.000 (the full number of the corresponding table)

... para ambas mesas.

Si uso un "INNER JOIN" entonces EXPLAIN da:

Para tabla "productos":

Same result as above.

Para la tabla "pricemaster_products":

type: "ref" possible_keys: "ean" key: ean key_len: 767 ref: func rows: 1 extra: using where

Ambas tablas tienen índices establecidos en las columnas relevantes. La única razón posible que se me ocurre para que LEFT JOIN sea tan lento es que no usa el índice en absoluto. Pero ¿por qué no?

La estructura de la tabla es la siguiente:

CREATE TABLE IF NOT EXISTS `pricemaster_products` ( `id` int(11) NOT NULL AUTO_INCREMENT, `provider` varchar(255) CHARACTER SET utf8 NOT NULL, `ean` varchar(255) CHARACTER SET utf8 NOT NULL, `title` varchar(255) CHARACTER SET utf8 NOT NULL, `gnp` double DEFAULT NULL, `vat` int(11) DEFAULT NULL, `cheapest_price_with_shipping` double DEFAULT NULL, `last_cheapest_price_update` int(11) DEFAULT NULL, `active` tinyint(1) NOT NULL DEFAULT ''0'', PRIMARY KEY (`id`), KEY `ean` (`ean`), KEY `title` (`title`), KEY `gnp` (`gnp`), KEY `vat` (`vat`), KEY `provider` (`provider`), KEY `cheapest_price_with_shipping` (`cheapest_price_with_shipping`), KEY `last_cheapest_price_update` (`last_cheapest_price_update`), KEY `active` (`active`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=58436 ; CREATE TABLE IF NOT EXISTS `products` ( `products_id` int(11) NOT NULL AUTO_INCREMENT, `products_ean` varchar(128) DEFAULT NULL, `products_status` tinyint(1) NOT NULL DEFAULT ''1'', [a lot more of fields with no connection to the query in question] PRIMARY KEY (`products_id`), KEY `products_status` (`products_status`), KEY `products_ean` (`products_ean`), ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=105518 ;