Я хочу сократить время, затрачиваемое на запрос в mysql.Уменьшить время выполнения запроса
Есть три таблицы говорят
- A ~ 600K строк,
- B ~ 2K строк,
- C ~ 100K строк
, имеющий 2 колонки каждый.
- А имеет один столбец, который используется в агрегации и другие, чтобы присоединиться к таблице В.
- В имеет один столбец, чтобы присоединиться с А и другой с C
- С имеет один столбец, чтобы присоединиться с В и другой столбец для группировки.
Каким должен быть план индексирования для сокращения времени выполнения. На данный момент он использует временные таблицы, а затем сортирует файлы. Есть ли способ избежать временных таблиц.
Пример запроса:
SELECT
sum(`revenue_facts`.`total_price`) AS `m0`
FROM
`category_groups` AS `category_groups`,
`revenue_facts` AS `revenue_facts`,
`dim_products` AS `dim_products`
WHERE
`dim_products`.`product_category_group_sk` = `category_groups`.`product_category_group_sk` AND
`revenue_facts`.`product_sk` = `dim_products`.`product_sk`
GROUP BY `category_groups`.`category_name`;
У меня уже есть индексы на группы по столбцу и столбцы присоединиться.
мой вопрос в настоящее время принимаю * 6 минута * s. Я хочу сократить время. структура таблицы, как
таблица А:
CREATE TABLE `revenue_facts` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`product_sk` bigint(20) unsigned NOT NULL,
`total_price` decimal(12,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `product_sk` (`product_sk`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Таблица B:
CREATE TABLE `dim_products` (
`product_sk` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`product_category_group_sk` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`product_sk`),
KEY `product_id` (`product_id`),
KEY (`product_sk`) (`product_sk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
таблицу С: Схема
CREATE TABLE `category_groups` (
`product_category_group_sk` bigint(20) unsigned NOT NULL,
`category_sk` bigint(20) unsigned NOT NULL,
`category_name` varchar(255) NOT NULL,
PRIMARY KEY (`product_category_group_sk`,`category_sk`),
KEY `category_sk` (`category_sk`),
KEY `product_category_group_sk` (`product_category_group_sk`
KEY `category_sk` (`category_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Исполнение используется:
1 SIMPLE dim_products index PRIMARY,product_category_group_index product_category_group_index 8 NULL 651264 Using index; Using temporary; Using filesort
1 SIMPLE category_groups ref PRIMARY,category_sk,product_category_group_sk,category_name product_category_group_sk 8 etl_testing.dim_products.product_category_group_sk 4 Using index
1 SIMPLE revenue_facts ref product_sk product_sk 8 etl_testing..dim_products.product_sk 5 NULL
Разместить свои структуры таблицы и объяснить план –
Ваши показатели, кажется, хорошо. . В чем дело? Насколько медленным является ваш запрос? – Arnab
Невозможно избежать временного и fileort, если вы используете объединение и группу, как это. Добавьте дополнительную информацию о том, что именно вы пытаетесь сделать. Использование FROM table_name AS имя_таблицы просто делает запрос уродливым. И было бы полезно, если бы вы действительно сказали, какая таблица A, B, C, поэтому нам не нужно так долго смотреть, где вычесть, кто есть кто. – aconrad