I have this query that's taking 1.7 seconds to perform:
SELECT
i.id_items AS id,
i.names,
GROUP_CONCAT(DISTINCT iafv.face_value ORDER BY iafv.face_value ASC SEPARATOR ', ') AS facesValues,
GROUP_CONCAT(DISTINCT iacut.translation ORDER BY iacut.translation ASC SEPARATOR ', ') AS currencies,
GROUP_CONCAT(DISTINCT cout.translation ORDER BY cout.translation ASC SEPARATOR ', ') AS countries,
GROUP_CONCAT(DISTINCT iacot.translation ORDER BY iacot.translation ASC SEPARATOR ', ') AS compositions,
GROUP_CONCAT(DISTINCT iacc.catalog_code ORDER BY iacc.catalog_code ASC SEPARATOR ', ') AS catalogCodes,
GROUP_CONCAT(DISTINCT iaio.issues_on ORDER BY iaio.issues_on ASC SEPARATOR ', ') AS issuesOn,
GROUP_CONCAT(DISTINCT iali.last_issues ORDER BY iali.last_issues ASC SEPARATOR ', ') AS latestIssues,
MIN(ucfs.price) AS minPrice,
SUM(ucfs.units) AS totalUnits
FROM
(SELECT
i.id_items,
GROUP_CONCAT(DISTINCT iant.translation ORDER BY iant.translation asc SEPARATOR ', ') AS names
FROM
items i
INNER JOIN languages AS l ON l.language_code = "en"
LEFT JOIN items_atr_names_match AS ianm ON ianm.id_items = i.id_items
LEFT JOIN items_atr_names_translations AS iant ON iant.id_items_atr_names = ianm.id_items_atr_names AND iant.id_language_code = l.id_languages
LEFT JOIN items_atr_names AS ian ON ian.id_items_atr_names = ianm.id_items_atr_names
GROUP BY id_items
ORDER BY names asc
LIMIT 0, 20) AS i
INNER JOIN languages AS l ON l.language_code = "en"
LEFT JOIN items_atr_faces_values_match AS iafvm ON iafvm.id_items = i.id_items
LEFT JOIN items_atr_faces_values AS iafv ON iafv.id_items_atr_faces_values = iafvm.id_items_atr_faces_values
LEFT JOIN items_atr_currencies_match AS iacum ON iacum.id_items = i.id_items
LEFT JOIN items_atr_currencies_translations AS iacut ON iacut.id_items_atr_currencies = iacum.id_items_atr_currencies AND iacut.id_language_code = l.id_languages
LEFT JOIN items_atr_currencies AS iacu ON iacu.id_items_atr_currencies = iacum.id_items_atr_currencies
LEFT JOIN items_atr_countries_match AS iacoum ON iacoum.id_items = i.id_items
LEFT JOIN items_atr_countries_translations AS cout ON cout.id_items_atr_countries = iacoum.id_items_atr_countries AND cout.id_language_code = l.id_languages
LEFT JOIN items_atr_countries AS cou ON cou.id_items_atr_countries = iacoum.id_items_atr_countries
LEFT JOIN items_atr_compositions_match AS iacom ON iacom.id_items = i.id_items
LEFT JOIN items_atr_compositions_translations AS iacot ON iacot.id_items_atr_compositions = iacom.id_items_atr_compositions AND iacot.id_language_code = l.id_languages
LEFT JOIN items_atr_compositions AS iaco ON iaco.id_items_atr_compositions = iacom.id_items_atr_compositions
LEFT JOIN items_atr_catalog_codes_match AS iaccm ON iaccm.id_items = i.id_items
LEFT JOIN items_atr_catalog_codes AS iacc ON iacc.id_items_atr_catalog_codes = iaccm.id_items_atr_catalog_codes
LEFT JOIN items_atr_issues_on_match AS iaiom ON iaiom.id_items = i.id_items
LEFT JOIN items_atr_issues_on AS iaio ON iaio.id_items_atr_issues_on = iaiom.id_items_atr_issues_on
LEFT JOIN items_atr_last_issues_match AS ialim ON ialim.id_items = i.id_items
LEFT JOIN items_atr_last_issues AS iali ON iali.id_items_atr_last_issues = ialim.id_items_atr_last_issues
LEFT JOIN users_coins_for_sale AS ucfs ON ucfs.id_items = i.id_items
LEFT JOIN users AS u ON u.id_users = ucfs.id_users AND u.status = 'active'
GROUP BY id
ORDER BY names asc
This is creation sql for the tables with the index information:
CREATE TABLE IF NOT EXISTS `items` (
`id_items` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_users` int(11) unsigned NOT NULL DEFAULT '0',
`date` date NOT NULL,
`views` bigint(20) NOT NULL DEFAULT '0',
`status` enum('draft','published') NOT NULL DEFAULT 'draft',
PRIMARY KEY (`id_items`),
UNIQUE KEY `id_items` (`id_items`),
KEY `id_users` (`id_users`),
CONSTRAINT `FK_items_users` FOREIGN KEY (`id_users`) REFERENCES `users` (`id_users`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_catalog_codes` (
`id_items_atr_catalog_codes` int(11) unsigned NOT NULL AUTO_INCREMENT,
`catalog_code` varchar(100) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_catalog_codes`),
UNIQUE KEY `id_items_atr_catalog_codes` (`id_items_atr_catalog_codes`),
FULLTEXT KEY `catalog_code` (`catalog_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_catalog_codes_match` (
`id_items_atr_catalog_codes_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_catalog_codes` int(11) unsigned NOT NULL,
`id_items` int(11) unsigned NOT NULL,
PRIMARY KEY (`id_items_atr_catalog_codes_match`),
UNIQUE KEY `id_items_atr_catalog_codes_match` (`id_items_atr_catalog_codes_match`),
KEY `id_items` (`id_items`),
KEY `id_items_atr_catalog_codes` (`id_items_atr_catalog_codes`),
CONSTRAINT `FK_catalog_codes_items_match_catalog_codes` FOREIGN KEY (`id_items_atr_catalog_codes`) REFERENCES `items_atr_catalog_codes` (`id_items_atr_catalog_codes`),
CONSTRAINT `FK_catalog_codes_items_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_compositions` (
`id_items_atr_compositions` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_items_atr_compositions`),
UNIQUE KEY `id_items_atr_compositions` (`id_items_atr_compositions`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_compositions_match` (
`id_items_atr_compositions_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_compositions` int(11) unsigned NOT NULL DEFAULT '0',
`id_items` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_compositions_match`),
UNIQUE KEY `id_items_atr_compositions_match` (`id_items_atr_compositions_match`),
KEY `id_items` (`id_items`),
KEY `id_items_atr_compositions` (`id_items_atr_compositions`),
CONSTRAINT `FK_compositions_items_match_compositions` FOREIGN KEY (`id_items_atr_compositions`) REFERENCES `items_atr_compositions` (`id_items_atr_compositions`),
CONSTRAINT `FK_compositions_items_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_compositions_translations` (
`id_items_atr_compositions_translations` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_compositions` int(11) unsigned NOT NULL DEFAULT '0',
`id_language_code` int(11) unsigned NOT NULL DEFAULT '0',
`translation` varchar(250) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_compositions_translations`),
UNIQUE KEY `id_items_atr_compositions_translations` (`id_items_atr_compositions_translations`),
KEY `id_language_code` (`id_language_code`),
KEY `id_items_atr_compositions` (`id_items_atr_compositions`),
FULLTEXT KEY `translation` (`translation`),
CONSTRAINT `FK_compositions_translations_compositions` FOREIGN KEY (`id_items_atr_compositions`) REFERENCES `items_atr_compositions` (`id_items_atr_compositions`),
CONSTRAINT `FK_compositions_translations_languages` FOREIGN KEY (`id_language_code`) REFERENCES `languages` (`id_languages`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_countries` (
`id_items_atr_countries` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_items_atr_countries`),
UNIQUE KEY `id_items_atr_countries` (`id_items_atr_countries`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_countries_match` (
`id_items_atr_countries_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_countries` int(11) unsigned NOT NULL,
`id_items` int(11) unsigned NOT NULL,
PRIMARY KEY (`id_items_atr_countries_match`),
UNIQUE KEY `items_atr_countries_match` (`id_items_atr_countries_match`),
KEY `id_items` (`id_items`),
KEY `id_items_atr_countries` (`id_items_atr_countries`),
CONSTRAINT `FK__countries` FOREIGN KEY (`id_items_atr_countries`) REFERENCES `items_atr_countries` (`id_items_atr_countries`),
CONSTRAINT `FK__items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_countries_translations` (
`id_items_atr_countries_translations` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_countries` int(11) unsigned NOT NULL DEFAULT '0',
`id_language_code` int(11) unsigned NOT NULL DEFAULT '0',
`translation` varchar(250) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_countries_translations`),
UNIQUE KEY `id_items_atr_countries_translations` (`id_items_atr_countries_translations`),
KEY `id_items_atr_countries` (`id_items_atr_countries`),
KEY `id_language_code` (`id_language_code`),
FULLTEXT KEY `translation` (`translation`),
CONSTRAINT `FK__items_atr_countries` FOREIGN KEY (`id_items_atr_countries`) REFERENCES `items_atr_countries` (`id_items_atr_countries`),
CONSTRAINT `FK_items_atr_countries_translations_languages` FOREIGN KEY (`id_language_code`) REFERENCES `languages` (`id_languages`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_currencies` (
`id_items_atr_currencies` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_items_atr_currencies`),
UNIQUE KEY `id_items_atr_currencies` (`id_items_atr_currencies`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_currencies_match` (
`id_items_atr_currencies_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_currencies` int(11) unsigned NOT NULL DEFAULT '0',
`id_items` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_currencies_match`),
UNIQUE KEY `id_items_atr_currencies_match` (`id_items_atr_currencies_match`),
KEY `id_items_atr_currencies` (`id_items_atr_currencies`),
KEY `id_items` (`id_items`),
CONSTRAINT `FK_items_atr_currencies_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`),
CONSTRAINT `FK_items_atr_currencies_match_items_atr_currencies` FOREIGN KEY (`id_items_atr_currencies`) REFERENCES `items_atr_currencies` (`id_items_atr_currencies`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_currencies_translations` (
`id_items_atr_currencies_translations` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_currencies` int(11) unsigned NOT NULL DEFAULT '0',
`id_language_code` int(11) unsigned NOT NULL DEFAULT '0',
`translation` varchar(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_currencies_translations`),
UNIQUE KEY `id_items_atr_currencies_translations` (`id_items_atr_currencies_translations`),
KEY `id_items_atr_currencies` (`id_items_atr_currencies`),
KEY `id_language_code` (`id_language_code`),
FULLTEXT KEY `translation` (`translation`),
CONSTRAINT `FK_items_atr_currencies_translations_items_atr_currencies` FOREIGN KEY (`id_items_atr_currencies`) REFERENCES `items_atr_currencies` (`id_items_atr_currencies`),
CONSTRAINT `FK_items_atr_currencies_translations_languages` FOREIGN KEY (`id_language_code`) REFERENCES `languages` (`id_languages`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_faces_values` (
`id_items_atr_faces_values` int(11) unsigned NOT NULL AUTO_INCREMENT,
`face_value` decimal(11,2) unsigned NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id_items_atr_faces_values`),
KEY `face_value` (`face_value`),
KEY `id-fv` (`id_items_atr_faces_values`,`face_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_faces_values_match` (
`id_items_atr_faces_values_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_faces_values` int(11) unsigned NOT NULL DEFAULT '0',
`id_items` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_faces_values_match`),
UNIQUE KEY `id_items_atr_faces_values_match` (`id_items_atr_faces_values_match`),
KEY `id_items_atr_faces_values` (`id_items_atr_faces_values`),
KEY `id_items` (`id_items`),
KEY `idItems-IdFaceValue` (`id_items`,`id_items_atr_faces_values`),
CONSTRAINT `FK_items_atr_faces_values_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`),
CONSTRAINT `FK_items_atr_faces_values_match_items_atr_faces_values` FOREIGN KEY (`id_items_atr_faces_values`) REFERENCES `items_atr_faces_values` (`id_items_atr_faces_values`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_issues_on` (
`id_items_atr_issues_on` int(11) unsigned NOT NULL AUTO_INCREMENT,
`issues_on` varchar(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_issues_on`),
UNIQUE KEY `id_items_atr_issues_on` (`id_items_atr_issues_on`),
FULLTEXT KEY `issues_on` (`issues_on`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_issues_on_match` (
`id_items_atr_issues_on_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_issues_on` int(11) unsigned NOT NULL,
`id_items` int(11) unsigned NOT NULL,
PRIMARY KEY (`id_items_atr_issues_on_match`),
UNIQUE KEY `id_items_atr_issues_on_match` (`id_items_atr_issues_on_match`),
KEY `id_items_atr_issues_on` (`id_items_atr_issues_on`),
KEY `id_items` (`id_items`),
CONSTRAINT `FK_items_atr_issues_on_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`),
CONSTRAINT `FK_items_atr_issues_on_match_items_atr_issues_on` FOREIGN KEY (`id_items_atr_issues_on`) REFERENCES `items_atr_issues_on` (`id_items_atr_issues_on`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_last_issues` (
`id_items_atr_last_issues` int(11) unsigned NOT NULL AUTO_INCREMENT,
`last_issues` varchar(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_last_issues`),
UNIQUE KEY `id_items_atr_last_issues` (`id_items_atr_last_issues`),
FULLTEXT KEY `last_issues` (`last_issues`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_last_issues_match` (
`id_items_atr_last_issues_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_last_issues` int(11) unsigned NOT NULL DEFAULT '0',
`id_items` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_last_issues_match`),
UNIQUE KEY `id_items_atr_last_issues_match` (`id_items_atr_last_issues_match`),
KEY `id_items_atr_last_issues` (`id_items_atr_last_issues`),
KEY `id_items` (`id_items`),
CONSTRAINT `FK_items_atr_last_issues_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`),
CONSTRAINT `FK_items_atr_last_issues_match_items_atr_last_issues` FOREIGN KEY (`id_items_atr_last_issues`) REFERENCES `items_atr_last_issues` (`id_items_atr_last_issues`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_names` (
`id_items_atr_names` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_items_atr_names`),
UNIQUE KEY `id_items_atr_names` (`id_items_atr_names`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_names_match` (
`id_items_atr_names_match` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_names` int(11) unsigned NOT NULL DEFAULT '0',
`id_items` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_names_match`),
UNIQUE KEY `id_items_atr_names_match` (`id_items_atr_names_match`),
KEY `id_items_atr_names` (`id_items_atr_names`),
KEY `id_items` (`id_items`),
CONSTRAINT `FK_items_atr_names_match_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`),
CONSTRAINT `FK_items_atr_names_match_items_atr_names` FOREIGN KEY (`id_items_atr_names`) REFERENCES `items_atr_names` (`id_items_atr_names`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `items_atr_names_translations` (
`id_items_atr_names_translations` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items_atr_names` int(11) unsigned NOT NULL DEFAULT '0',
`id_language_code` int(11) unsigned NOT NULL DEFAULT '0',
`translation` varchar(250) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_items_atr_names_translations`),
UNIQUE KEY `id_items_atr_names_translations` (`id_items_atr_names_translations`),
KEY `id_language_code` (`id_language_code`),
KEY `id_items_atr_names` (`id_items_atr_names`),
KEY `translation_indx` (`translation`),
FULLTEXT KEY `translation` (`translation`),
CONSTRAINT `FK_items_atr_names_translations_items_atr_names` FOREIGN KEY (`id_items_atr_names`) REFERENCES `items_atr_names` (`id_items_atr_names`),
CONSTRAINT `FK_items_atr_names_translations_languages` FOREIGN KEY (`id_language_code`) REFERENCES `languages` (`id_languages`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `languages` (
`id_languages` int(11) unsigned NOT NULL,
`language_code` char(2) NOT NULL,
PRIMARY KEY (`id_languages`),
UNIQUE KEY `language_code` (`language_code`),
KEY `id-language_code` (`id_languages`,`language_code`),
KEY `language-code` (`language_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `languages_translations` (
`id_languages_translations` int(11) unsigned NOT NULL,
`id_languages` int(11) unsigned NOT NULL,
`id_language_code` int(11) unsigned NOT NULL,
`translation` varchar(255) NOT NULL,
PRIMARY KEY (`id_languages_translations`),
UNIQUE KEY `id_languages_translations` (`id_languages_translations`),
KEY `id_languages` (`id_languages`),
KEY `language_code` (`id_language_code`),
FULLTEXT KEY `translation` (`translation`),
CONSTRAINT `FK_languages_translations_languages` FOREIGN KEY (`id_languages`) REFERENCES `languages` (`id_languages`),
CONSTRAINT `FK_languages_translations_languages_2` FOREIGN KEY (`id_language_code`) REFERENCES `languages` (`id_languages`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `users_coins_for_sale` (
`id_users_coins_for_sale` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_items` int(11) unsigned NOT NULL,
`id_users` int(11) unsigned NOT NULL,
`units` int(5) unsigned NOT NULL,
`year` varchar(5) NOT NULL,
`grade` enum('good','very_good','fine','very_fine','extra_fine','about_uncirculated','uncirculated','brilliant_uncirculated','proof') NOT NULL,
`price` decimal(8,2) unsigned NOT NULL,
`picture` varchar(500) DEFAULT NULL,
`comment` varchar(500) DEFAULT NULL,
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id_users_coins_for_sale`),
UNIQUE KEY `id_users_coins_for_sale_unique` (`id_users_coins_for_sale`),
KEY `id_items` (`id_items`),
KEY `id_users` (`id_users`),
KEY `year` (`year`),
KEY `grade` (`grade`),
KEY `id_users_coins_for_sale` (`id_users_coins_for_sale`),
KEY `idItems-idUsers` (`id_items`,`id_users`),
CONSTRAINT `FK_users_coins_for_sale_items` FOREIGN KEY (`id_items`) REFERENCES `items` (`id_items`),
CONSTRAINT `FK_users_coins_for_sale_users` FOREIGN KEY (`id_users`) REFERENCES `users` (`id_users`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Here is the explain of the query:
In the explain I can see sometimes the indexes are used but sometimes not, I wonder what I can do to improve the performance in this query, if I've created the index correctly or if I'm missing any index.
The items table has 90k entries but I think it's not big enough to take 1.7 seconds...
I've been following this link to learn best practices: https://stackoverflow.com/a/3049329
Do you have any advice about how I can improve the performance?
Thanks in advance