Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / 3 таблицы, 2 left join-а, ну очень дооолго! Подскажите. / 4 сообщений из 4, страница 1 из 1
22.08.2013, 15:55:22
    #38374896
AlexSSSS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 таблицы, 2 left join-а, ну очень дооолго! Подскажите.
Дано:
Таблица заголовков чеков
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE `receipt` (
  `store` varchar(100) NOT NULL DEFAULT '',
  `cash_number` int(11) NOT NULL DEFAULT '0',
  `cash_id` int(11) NOT NULL DEFAULT '0',
  `id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `local_number` bigint(20) unsigned NOT NULL DEFAULT '0',
  `type` bigint(20) unsigned DEFAULT NULL,
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `result` bigint(20) unsigned DEFAULT NULL,
  PRIMARY KEY (`cash_id`,`id`),
  KEY `receipt_idx1` (`store`),
  KEY `receipt_idx2` (`cash_number`),
  KEY `receipt_idx3` (`local_number`),
  KEY `receipt_idx4` (`type`),
  KEY `receipt_idx5` (`date`),
  KEY `receipt_idx6` (`result`),
  KEY `receipt_idx7` (`footer_date`),
  KEY `receipt_idx8` (`ext_host`),
  KEY `receipt_idx9` (`ext_fox`),
  KEY `store_date` (`store`,`date`),
  KEY `ext_processed` (`ext_processed`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=105;


Таблица тела чека:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE `receipt_item` (
  `store` varchar(100) NOT NULL DEFAULT '',
  `cash_id` int(11) NOT NULL DEFAULT '0',
  `id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `receipt_header` bigint(20) unsigned NOT NULL DEFAULT '0',
  `item` varchar(40) NOT NULL DEFAULT '',
  `name` varchar(100) NOT NULL DEFAULT '',
  `quantity` decimal(20,4) DEFAULT NULL,
  `price` decimal(20,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`cash_id`,`id`),
  KEY `receipt_item_idx1` (`store`),
  KEY `receipt_item_idx2` (`cash_number`),
  KEY `receipt_item_idx4` (`item`),
  KEY `receipt_item_idx5` (`type`),
  KEY `receipt_item_idx3` (`receipt_header`,`cash_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=199;


И третья таблица - со скидками:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `receipt_item_discount` (
  `store` varchar(100) NOT NULL DEFAULT '',
  `cash_number` int(11) NOT NULL DEFAULT '0',
  `cash_id` int(11) NOT NULL DEFAULT '0',
  `id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `receipt_item` bigint(20) unsigned NOT NULL DEFAULT '0',
  `increment` decimal(20,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`cash_id`,`id`),
  KEY `receipt_item_discount_idx1` (`receipt_item`),
  KEY `receipt_item_discount_idx2` (`receipt_discount`,`cash_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=60;


Надо вытащить "плоскую" таблицу.
Пишу:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT r.store,r.cash_id,ri.`id`,r.date,r.`local_number`,r.`type`,ri.`item`,ri.`quantity`,
ri.`price`,if(ISNULL(rid.increment),0,rid.increment) as skid_r from receipt_item ri 
left join receipt_item_discount rid on (rid.cash_id=ri.cash_id and rid.receipt_item=ri.id) 
left join receipt r on (r.cash_id=ri.cash_id and r.id=ri.`receipt_header`) 
where r.date>"2013-08-15 05:00:00" and r.date<"2013-08-16 05:00:00" and
r.result=0


время выполнения
Код: plaintext
/* Результат : "записей извлечено: 82719 (00:08:55)" */
Что можно поковырять?

З.Ы. explain, натравленный на этот запрос выдал следующее:
Код: plaintext
1.
2.
3.
4.
id	select_type	table	type	possible_keys						key							key_len	ref									rows	Extra                                                                                                
1	SIMPLE		r		range	PRIMARY,receipt_idx5,receipt_idx6	receipt_idx5				8		null								38 583	Using where                                                                                          
1	SIMPLE		ri		ref		PRIMARY,receipt_item_idx3			receipt_item_idx3			12		myexport.r.id,myexport.r.cash_id	2
1	SIMPLE		rid		ref		PRIMARY,receipt_item_discount_idx1	receipt_item_discount_idx1	8		myexport.ri.id						17
...
Рейтинг: 0 / 0
22.08.2013, 17:04:53
    #38375033
3 таблицы, 2 left join-а, ну очень дооолго! Подскажите.
Установлены ли индексы на все из перечисленных ниже столбцы?
r.id
r.cash_id
r.date
ri.id
ri.cash_id
ri.receipt_header
rid.cash_id
rid.receipt_item

Если нет, попробуй установить.
...
Рейтинг: 0 / 0
22.08.2013, 17:25:07
    #38375074
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 таблицы, 2 left join-а, ну очень дооолго! Подскажите.
AlexSSSS,

пожалуйста форматируйте СКЛ получше:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
  r.store,
  r.cash_id,
  ri.`id`,
  r.date,
  r.`local_number`,
  r.`type`,
  ri.`item`,
  ri.`quantity`,
  ri.`price`,
  if(ISNULL(rid.increment),0,rid.increment) as skid_r 
from receipt_item ri 
  left join receipt_item_discount rid on (rid.cash_id=ri.cash_id and rid.receipt_item=ri.id) 
  left join receipt r on (r.cash_id=ri.cash_id and r.id=ri.`receipt_header`) 
where r.date>"2013-08-15 05:00:00" 
  and r.date<"2013-08-16 05:00:00" 
  and r.result=0
...
Рейтинг: 0 / 0
22.08.2013, 17:28:29
    #38375079
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 таблицы, 2 left join-а, ну очень дооолго! Подскажите.
javajdbcAlexSSSS,

пожалуйста форматируйте СКЛ получше:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
  r.store,
  r.cash_id,
  ri.`id`,
  r.date,
  r.`local_number`,
  r.`type`,
  ri.`item`,
  ri.`quantity`,
  ri.`price`,
  if(ISNULL(rid.increment),0,rid.increment) as skid_r 
from receipt_item ri 
  left join receipt_item_discount rid on (rid.cash_id=ri.cash_id and rid.receipt_item=ri.id) 
  left join receipt r on (r.cash_id=ri.cash_id and r.id=ri.`receipt_header`) 
where r.date>"2013-08-15 05:00:00" 
  and r.date<"2013-08-16 05:00:00" 
  and r.result=0



если вы ставите таблицу R после ЛЕФТ ЖОИНТ
а потом филтруете ее в WHERE, то получается
обычный ЖОИНТ.

Так что прежде чем советовать вам индексы,
разберитесь с логикой -- лефт жоин или обычный.
Это влияет на порядок соединения а значит на
точные индексы которые надо сделать.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / 3 таблицы, 2 left join-а, ну очень дооолго! Подскажите. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]