Hi, I have a question about MySQL performance.
I have the following three tables
CREATE TABLE `articulos` (
`Código` varchar(10) collate latin1_spanish_ci NOT NULL,
`Descripción` varchar(50) collate latin1_spanish_ci NOT NULL,
`Usa_Talles` char(1) collate latin1_spanish_ci NOT NULL,
`Usa_Colores` char(1) collate latin1_spanish_ci NOT NULL,
PRIMARY KEY (`Código`),
KEY `Descripción` (`Descripción`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
CREATE TABLE `articulos_colores` (
`Código` varchar(4) collate latin1_spanish_ci NOT NULL,
`Descripción` varchar(30) collate latin1_spanish_ci NOT NULL,
PRIMARY KEY (`Código`),
KEY `Descripción` (`Descripción`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
CREATE TABLE `articulos_talles` (
`Código` tinyint(4) unsigned NOT NULL,
`Descripción` varchar(20) collate latin1_spanish_ci NOT NULL,
PRIMARY KEY (`Código`),
KEY `Descripción` (`Descripción`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
Articulos has about 750 records, articulos_colores has about 500 and articulos_talles as 8.
I use the following query to return the full articles combinations about the articles with their respective colors and sizes (depending on Usa_Colores equals 'S' and the same for Usa_Talles (size in spanish))
SELECT `articulos`.`Código` as `codart`,
`articulos_colores`.`Código` as `codcol`,
`articulos_talles`.`Código` as `codtalle`
FROM `articulos`
LEFT JOIN `articulos_colores` ON `articulos`.`Usa_Colores`='S' XOR `articulos_colores`.`Código`='0000'
LEFT JOIN `articulos_talles` ON `articulos`.`Usa_Talles`='S' XOR `articulos_talles`.`Código`=0;
This query gives me the results (about 180.000 records) in 8 seconds. I think that is too much for the little count of records.
The "EXPLAIN" in the above query gives me this info
+----+-------------+-------------------+-------+------------ ---+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+-------+------------ ---+---------+---------+------+------+-------------+
| 1 | SIMPLE | articulos | ALL | NULL | NULL | NULL | NULL | 250 | |
| 1 | SIMPLE | articulos_colores | index | NULL | PRIMARY | 6 | NULL | 761 | Using index |
| 1 | SIMPLE | articulos_talles | index | NULL | PRIMARY | 1 | NULL | 8 | Using index |
+----+-------------+-------------------+-------+------------ ---+---------+---------+------+------+-------------+
3 rows in set
I'm relatively new to MySql... what should I do in order to improve performance?
(My installation is mysql 5.0.45 in Windows XP, P4 1.8ghz, 1.5gb ram)
Thanks in advance,
Mauro.
I have the following three tables
CREATE TABLE `articulos` (
`Código` varchar(10) collate latin1_spanish_ci NOT NULL,
`Descripción` varchar(50) collate latin1_spanish_ci NOT NULL,
`Usa_Talles` char(1) collate latin1_spanish_ci NOT NULL,
`Usa_Colores` char(1) collate latin1_spanish_ci NOT NULL,
PRIMARY KEY (`Código`),
KEY `Descripción` (`Descripción`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
CREATE TABLE `articulos_colores` (
`Código` varchar(4) collate latin1_spanish_ci NOT NULL,
`Descripción` varchar(30) collate latin1_spanish_ci NOT NULL,
PRIMARY KEY (`Código`),
KEY `Descripción` (`Descripción`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
CREATE TABLE `articulos_talles` (
`Código` tinyint(4) unsigned NOT NULL,
`Descripción` varchar(20) collate latin1_spanish_ci NOT NULL,
PRIMARY KEY (`Código`),
KEY `Descripción` (`Descripción`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
Articulos has about 750 records, articulos_colores has about 500 and articulos_talles as 8.
I use the following query to return the full articles combinations about the articles with their respective colors and sizes (depending on Usa_Colores equals 'S' and the same for Usa_Talles (size in spanish))
SELECT `articulos`.`Código` as `codart`,
`articulos_colores`.`Código` as `codcol`,
`articulos_talles`.`Código` as `codtalle`
FROM `articulos`
LEFT JOIN `articulos_colores` ON `articulos`.`Usa_Colores`='S' XOR `articulos_colores`.`Código`='0000'
LEFT JOIN `articulos_talles` ON `articulos`.`Usa_Talles`='S' XOR `articulos_talles`.`Código`=0;
This query gives me the results (about 180.000 records) in 8 seconds. I think that is too much for the little count of records.
The "EXPLAIN" in the above query gives me this info
+----+-------------+-------------------+-------+------------ ---+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+-------+------------ ---+---------+---------+------+------+-------------+
| 1 | SIMPLE | articulos | ALL | NULL | NULL | NULL | NULL | 250 | |
| 1 | SIMPLE | articulos_colores | index | NULL | PRIMARY | 6 | NULL | 761 | Using index |
| 1 | SIMPLE | articulos_talles | index | NULL | PRIMARY | 1 | NULL | 8 | Using index |
+----+-------------+-------------------+-------+------------ ---+---------+---------+------+------+-------------+
3 rows in set
I'm relatively new to MySql... what should I do in order to improve performance?
(My installation is mysql 5.0.45 in Windows XP, P4 1.8ghz, 1.5gb ram)
Thanks in advance,
Mauro.
Comment