2014-01-29 3 views
0

Я хочу сократить время, затрачиваемое на запрос в mysql.Уменьшить время выполнения запроса

Есть три таблицы говорят

  1. A ~ 600K строк,
  2. B ~ 2K строк,
  3. C ~ 100K строк

, имеющий 2 колонки каждый.

  1. А имеет один столбец, который используется в агрегации и другие, чтобы присоединиться к таблице В.
  2. В имеет один столбец, чтобы присоединиться с А и другой с C
  3. С имеет один столбец, чтобы присоединиться с В и другой столбец для группировки.

Каким должен быть план индексирования для сокращения времени выполнения. На данный момент он использует временные таблицы, а затем сортирует файлы. Есть ли способ избежать временных таблиц.

Пример запроса:

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 
+3

Разместить свои структуры таблицы и объяснить план –

+0

Ваши показатели, кажется, хорошо. . В чем дело? Насколько медленным является ваш запрос? – Arnab

+0

Невозможно избежать временного и fileort, если вы используете объединение и группу, как это. Добавьте дополнительную информацию о том, что именно вы пытаетесь сделать. Использование FROM table_name AS имя_таблицы просто делает запрос уродливым. И было бы полезно, если бы вы действительно сказали, какая таблица A, B, C, поэтому нам не нужно так долго смотреть, где вычесть, кто есть кто. – aconrad

ответ

-1

Попробуйте это:

SELECT 
    sum(`revenue_facts`.`total_price`) AS `m0` 
FROM 
    (`dim_products` LEFT JOIN `category_groups` ON `dim_products`.`product_category_group_sk` = `category_groups`.`product_category_group_sk`) 
    LEFT JOIN `revenue_facts` ON `dim_products`.`product_sk` = `revenue_facts`.`product_sk` 
GROUP BY `category_groups`.`category_name`; 

Кроме того, как сказал Абдул:

«Разместить свои структуры таблицы и объяснить план»

+0

должно быть включено INNER. – aconrad

+0

Использует ключевое слово join быстрее, чем usinh, где условия? –

Смежные вопросы