Quantcast
Channel: Recent Questions - Stack Overflow
Viewing all articles
Browse latest Browse all 12141

Optimize query with agregate function

$
0
0

I have this query, which durate 1.3s. Why is so long when I have all indexes? Can I somewhat optimize or simplify this query? I need to calculate data online. Saving to a table and regenerating once in a while is not something I want.

SELECT `countries`.*, `c2`.`country_name` AS `parent_name`,       COUNT(countryperiods.countryPeriod_id) AS `numberCountryPeriods`,       MIN(`from`) AS `min`, MAX(`to`) AS `max`,       `continents`.`continent_id`, `continents`.`continent_name`,       `continents`.`continent_seo`, `continents`.`continent_enabled` FROM `countries`INNER JOIN `us`LEFT JOIN `countries` AS `c2`   ON c2.country_id = countries.parent_idLEFT JOIN `s`    ON countries.country_id = s.country_idLEFT JOIN `countryperiods`    ON countryperiods.country_id = countries.country_idLEFT JOIN `continents`    ON continents.continent_id = countries.continent_idWHERE    (countries.country_id = s.country_id) AND    (f_user_id = '14') AND    (s.id = us.f_s_id) AND    (us_toChange = 1)GROUP BY `countries`.`country_id`ORDER BY `country_name` ASCLIMIT 1

I am attaching an overview of tables and indexes.

countries

CREATE TABLE `countries` (  `country_id` int(11) NOT NULL,  `continent_id` int(11) DEFAULT NULL,  `parent_id` int(11) DEFAULT NULL,  `currency_code` varchar(10) DEFAULT NULL,  `country_code` varchar(5) DEFAULT NULL,  `country_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,  `country_seo` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,  `country_enabled` tinyint(1) NOT NULL DEFAULT 1) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;ALTER TABLE `countries`ADD PRIMARY KEY (`country_id`),ADD KEY `continent_id` (`continent_id`),ADD KEY `parent_id` (`parent_id`);

s

CREATE TABLE `s` (  `id` int(11) NOT NULL,  `country_id` int(11) DEFAULT NULL,  `s_enabled` tinyint(1) NOT NULL DEFAULT 1) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;ALTER TABLE `s`ADD PRIMARY KEY (`id`),ADD KEY `country_id` (`country_id`);

countryperiods

CREATE TABLE `countryperiods` (  `countryPeriod_id` int(11) NOT NULL,  `country_id` int(11) DEFAULT NULL,  `from` smallint(4) DEFAULT NULL,  `to` smallint(4) DEFAULT NULL,  `countryPeriod_enabled` tinyint(1) NOT NULL DEFAULT 1) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;ALTER TABLE `countryperiods`ADD PRIMARY KEY (`countryPeriod_id`),ADD KEY `country_id` (`country_id`);

continents

CREATE TABLE `continents` (  `continent_id` int(11) NOT NULL,  `continent_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,  `continent_seo` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,  `continent_enabled` tinyint(1) NOT NULL DEFAULT 1) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;ALTER TABLE `continents`ADD PRIMARY KEY (`continent_id`);

us

CREATE TABLE `us` (  `uS_id` int(11) NOT NULL,  `f_user_id` int(11) DEFAULT NULL,  `f_s_id` int(11) DEFAULT NULL,  `us_toChange` tinyint(1) NOT NULL DEFAULT 0,) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;ALTER TABLE `us`ADD PRIMARY KEY (`uS_id`),ADD KEY `f_s_id` (`f_s_id`),ADD KEY `f_user_id` (`f_user_id`),ADD KEY `us` (`f_user_id`,`f_s_id`) USING BTREE;

Explainenter image description here


Viewing all articles
Browse latest Browse all 12141

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>