Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL тормозит на стадии "Copying to tmp table" / 25 сообщений из 25, страница 1 из 1
18.01.2014, 13:30:16
    #38530468
Гуляев Гоша
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Доброго дня всем!
Подскажите пожалуйста какое-то решение возникшей проблемы.
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT  aa.indData1 /*0*/, aa.indData2 /*1*/, 320*(aa.dblData1+bb.dblData1)+400*(cc.dblData1+dd.dblData1) /*2*/
FROM    crm_org_sch_data        AS aa
JOIN    crm_org_sch_data        AS bb ON (bb.indData1=aa.indData1 AND bb.indData2=aa.indData2)
JOIN    crm_org_sch_data        AS cc ON (cc.indData1=aa.indData1 AND cc.indData2=aa.indData2)
JOIN    crm_org_sch_data        AS dd ON (dd.indData1=aa.indData1 AND dd.indData2=aa.indData2)
JOIN    crm_org_sch_keys_row    AS a1 ON a1.dataID=aa.id
JOIN    crm_org_sch_keys_row    AS b1 ON b1.dataID=bb.id
JOIN    crm_org_sch_keys_row    AS c1 ON c1.dataID=cc.id
JOIN    crm_org_sch_keys_row    AS d1 ON d1.dataID=dd.id
JOIN    crm_org_sch_keys        AS a2 ON a2.id=a1.keyID
JOIN    crm_org_sch_keys        AS b2 ON b2.id=b1.keyID
JOIN    crm_org_sch_keys        AS c2 ON c2.id=c1.keyID
JOIN    crm_org_sch_keys        AS d2 ON d2.id=d1.keyID
WHERE   1        
    AND ((aa.indData1 BETWEEN 1380650399 AND 1380736799 ))
    AND a2.keyVal="summ.sch.data.1"
    AND b2.keyVal="summ.sch.data.2"
    AND c2.keyVal="summ.sch.data.3"
    AND d2.keyVal="summ.sch.data.4"
GROUP BY   aa.id
ORDER BY   aa.indData1 ASC,
           aa.indData2 ASC



При изменении параметров в BETWEEN (т.е. когда запроса не оказывается в кэше запросов) запрос подвисает секунд на тридцать.
Профилирование показывает что он висит на стадии copying to tmp table
Подскажите пожалуйста в чём косяк? Другие запросы (а их много) не тормозят.
Вычитал что проблема может быть в слишком большом кол-ве индексов. Если так то объясните пожалуйста где, в запросе или в таблицах?


OS: FreeBSD 9.2 amd64
MySQL: 5.5.32
my.cnf
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
[mysqld]
port                    = 3306
socket                  = /tmp/mysql.sock
disable-log-bin
key_buffer              = 256M
max_allowed_packet      = 1M

table_open_cache        = 2048
sort_buffer_size        = 32M
net_buffer_length       = 8K
read_buffer_size        = 32M
read_rnd_buffer_size    = 32M
myisam_sort_buffer_size = 16M
init_connect            = 'SET NAMES utf8'
character-set-server    = utf8
collation-server        = utf8_general_ci

tmp_table_size          = 512M
max_heap_table_size     = 512M

thread_cache_size       = 64

innodb_buffer_pool_size = 768M
innodb_log_file_size    = 256M

query_cache_size        = 64M
long_query_time         = 1
slow_query_log          = 1
slow_query_log_file     = /var/log/mysql.slow.log

Структура таблиц
crm_org_sch_data
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CREATE TABLE IF NOT EXISTS `crm_org_sch_data` (
  `id`       int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cDate`    int(10) unsigned NOT NULL,
  `sessID`   int(10) unsigned NOT NULL,
  `indData1` int(10) unsigned NOT NULL,
  `indData2` int(10) unsigned NOT NULL,
  `indData3` int(10) unsigned NOT NULL,
  `intData1` int(10) unsigned NOT NULL,
  `intData2` int(10) unsigned NOT NULL,
  `intData3` int(10) unsigned NOT NULL,
  `intData4` int(10) unsigned NOT NULL,
  `intData5` int(10) unsigned NOT NULL,
  `dblData1` double NOT NULL,
  `dblData2` double NOT NULL,
  `dblData3` double NOT NULL,
  `dblData4` double NOT NULL,
  `dblData5` double NOT NULL,
  `dblData6` double NOT NULL,
  `dblData7` double NOT NULL,
  `dblData8` double NOT NULL,
  `dblData9` double NOT NULL,
  `txtData1` char(255) NOT NULL,
  `txtData2` char(255) NOT NULL,
  `isActive` tinyint(3) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `sessID` (`sessID`),
  KEY `ind1` (`indData1`),
  KEY `ind2` (`indData2`),
  KEY `ind3` (`indData3`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Таблица с данными счётчиков'



crm_org_sch_keys
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE IF NOT EXISTS `crm_org_sch_keys` (
  `id`     int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cDate`  int(10) unsigned NOT NULL,
  `sessID` int(10) unsigned NOT NULL,
  `keyVal` char(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `keyVal` (`keyVal`),
  KEY `sessID` (`sessID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Таблица с информацией о ключах для данных счётчиков';



crm_org_sch_keys_row
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `crm_org_sch_keys_row` (
  `id`     int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cDate`  int(10) unsigned NOT NULL,
  `sessID` int(10) unsigned NOT NULL,
  `keyID`  int(10) unsigned NOT NULL,
  `dataID` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `sc_key` (`keyID`,`dataID`),
  KEY `sessID` (`sessID`),
  KEY `dataID` (`dataID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Таблица с информацией о связи ключей с данными счётчиков' 



У таблиц связи по внешним ключам:
*.sessID --> На таблицу crm_sessions , за ненадобностью её структуру тут не привожу
crm_org_sch_keys_row.keyID ---> crm_org_sch_keys.id
crm_org_sch_keys_row.dataID ---> crm_org_sch_data.id
...
Рейтинг: 0 / 0
18.01.2014, 13:49:37
    #38530473
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Гуляев Гоша,

план запроса покажите
...
Рейтинг: 0 / 0
18.01.2014, 13:49:55
    #38530474
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
авторПодскажите пожалуйста в чём косяк?
"косяк" в том, что запрос твой г.
избавляться нужно от GROUP BY "палюбасу"

так пробуй
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT  aa.indData1 /*0*/, aa.indData2 /*1*/, 320*(aa.dblData1+bb.dblData1)+400*(cc.dblData1+dd.dblData1) /*2*/
FROM    crm_org_sch_data        AS aa
JOIN    crm_org_sch_data        AS bb ON (bb.indData1=aa.indData1 AND bb.indData2=aa.indData2)
JOIN    crm_org_sch_data        AS cc ON (cc.indData1=aa.indData1 AND cc.indData2=aa.indData2)
JOIN    crm_org_sch_data        AS dd ON (dd.indData1=aa.indData1 AND dd.indData2=aa.indData2)
WHERE   1        
    AND ((aa.indData1 BETWEEN 1380650399 AND 1380736799 ))
and exists (select 1 from crm_org_sch_keys_row AS a1 join crm_org_sch_keys AS a2 ON a2.id=a1.keyID where a1.dataID=aa.id and a2.keyVal="summ.sch.data.1")
and exists (select 1 from crm_org_sch_keys_row AS b1 join crm_org_sch_keys AS b2 ON b2.id=b1.keyID where b1.dataID=bb.id and b2.keyVal="summ.sch.data.2")
and exists (select 1 from crm_org_sch_keys_row AS c1 join crm_org_sch_keys AS c2 ON c2.id=c1.keyID where c1.dataID=cc.id and c2.keyVal="summ.sch.data.3")
and exists (select 1 from crm_org_sch_keys_row AS d1 join crm_org_sch_keys AS d2 ON d2.id=d1.keyID where d1.dataID=dd.id and d2.keyVal="summ.sch.data.4")
ORDER BY   aa.indData1 ASC,
           aa.indData2 ASC
...
Рейтинг: 0 / 0
18.01.2014, 14:21:18
    #38530496
Гуляев Гоша
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
miksoft , вот план запроса только уже который предложил Гость112
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
+----+--------------------+-------+--------+----------------+--------+---------+-----------------+-------+-----------------------------+
| id | select_type        | table | type   | possible_keys  | key    | key_len | ref             | rows  | Extra                       |
+----+--------------------+-------+--------+----------------+--------+---------+-----------------+-------+-----------------------------+
|  1 | PRIMARY            | aa    | ALL    | ind1,ind2      | NULL   | NULL    | NULL            | 21238 | Using where; Using filesort |
|  1 | PRIMARY            | bb    | ref    | ind1,ind2      | ind1   | 4       | crm.aa.indData1 |     1 | Using where                 |
|  1 | PRIMARY            | cc    | ref    | ind1,ind2      | ind1   | 4       | crm.bb.indData1 |     1 | Using where                 |
|  1 | PRIMARY            | dd    | ref    | ind1,ind2      | ind1   | 4       | crm.aa.indData1 |     1 | Using where                 |
|  5 | DEPENDENT SUBQUERY | d2    | const  | PRIMARY,keyVal | keyVal | 96      | const           |     1 | Using index                 |
|  5 | DEPENDENT SUBQUERY | d1    | eq_ref | sc_key,dataID  | sc_key | 8       | const,crm.dd.id |     1 | Using index                 |
|  4 | DEPENDENT SUBQUERY | c2    | const  | PRIMARY,keyVal | keyVal | 96      | const           |     1 | Using index                 |
|  4 | DEPENDENT SUBQUERY | c1    | eq_ref | sc_key,dataID  | sc_key | 8       | const,crm.cc.id |     1 | Using index                 |
|  3 | DEPENDENT SUBQUERY | b2    | const  | PRIMARY,keyVal | keyVal | 96      | const           |     1 | Using index                 |
|  3 | DEPENDENT SUBQUERY | b1    | eq_ref | sc_key,dataID  | sc_key | 8       | const,crm.bb.id |     1 | Using index                 |
|  2 | DEPENDENT SUBQUERY | a2    | const  | PRIMARY,keyVal | keyVal | 96      | const           |     1 | Using index                 |
|  2 | DEPENDENT SUBQUERY | a1    | eq_ref | sc_key,dataID  | sc_key | 8       | const,crm.aa.id |     1 | Using index                 |
+----+--------------------+-------+--------+----------------+--------+---------+-----------------+-------+-----------------------------+
12 rows in set (0.00 sec)

Guest112 это изменение очень сократило время работы. Теперь он просит 5 сек и в профилировании никуда не упирается.
Можно ли ещё как-то ускорить запрос?

Guest112 отдельное спасибо за эту конструкцию, я о таком и не знал, теперь благодаря тебе арсенал знаний пополнен :)
...
Рейтинг: 0 / 0
18.01.2014, 15:25:07
    #38530532
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Гуляев ГошаМожно ли ещё как-то ускорить запрос?

а попробуйте ещё такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT  aa.indData1 /*0*/, aa.indData2 /*1*/, 
	  320*sum(case when a2.keyVal in ("summ.sch.data.1","summ.sch.data.2") then aa.dblData1 end)
	+ 400*sum(case when a2.keyVal in ("summ.sch.data.3","summ.sch.data.4") then aa.dblData1 end) /*2*/
FROM    crm_org_sch_data        AS aa
JOIN    crm_org_sch_keys_row 	AS a1	on a1.dataID=aa.id 
join 	crm_org_sch_keys 		AS a2 	ON a2.id=a1.keyID 

where aa.indData1 BETWEEN 1380650399 AND 1380736799
  and a2.keyVal in ("summ.sch.data.1","summ.sch.data.2","summ.sch.data.3","summ.sch.data.4")

group by aa.indData1, aa.indData2
having count(/* distinct ? */ a2.keyVal)=4


вроде эквивалентный ...
...
Рейтинг: 0 / 0
18.01.2014, 20:38:29
    #38530684
Гуляев Гоша
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
qwerty112 , спасибо огромное!
Снимаю шляпу. Не видя задачи дать последовательно без лишних расспросов два ответа улучшающих друг друга, это в моём представлении примерно как гадать по смске :)
Твой последний вариант просто работает без тормозов вне зависимости от закешированного запроса.
Смысл запроса вполне понятен, непонятно пока только каким образом достичь такого уровня мастерства чтобы вот так запросто безошибочно выдавать такие решения :)
Огромное спасибо!
Как говорят в саус парке: "Сегодня мы много поняли" :)
...
Рейтинг: 0 / 0
29.06.2014, 06:03:45
    #38682907
Alexandar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Помогите, пожалуйста, по возможности и с моим запросом:
Код: sql
1.
2.
3.
4.
5.
SELECT id, username, email, register_time, onlinetime, user_lastip
FROM uni1_users
WHERE `universe` = '1'
  AND user_lastip IN (SELECT user_lastip FROM uni1_users WHERE `universe` = '1' GROUP BY user_lastip HAVING COUNT(*)>1)
ORDER BY user_lastip, id ASC


Профилирование показывает что он висит на стадии copying to tmp table
Подскажите, пожалуйста, как поправить запрос? Другие запросы (а их много) не тормозят.
...
Рейтинг: 0 / 0
29.06.2014, 09:12:16
    #38682921
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT id, username, email, register_time, onlinetime, uni1_users.user_lastip 
FROM uni1_users 
JOIN (
 SELECT user_lastip FROM uni1_users WHERE `universe` = '1' GROUP BY 1 HAVING COUNT(*)>1
) t0 on uni1_users.user_lastip=t0.user_lastip
WHERE `universe` = '1'
ORDER BY uni1_users.user_lastip, id ASC
...
Рейтинг: 0 / 0
04.08.2014, 13:13:38
    #38712062
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Сегодня столкнулся с аналогичной проблемой, уже попытался JOIN заменить на неявный (т.к. анализ показал что так быстрее), но все равно на большой выборке очень большое время занимает копирование в темповую таблицу. Привожу последний вариант запроса и надеюсь, что кто-нибудь поможет с его модернизацией для ускорения. Все дополнительные данные по запросу могу выложить дополнительно.
Вот собственно сам запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT `parameter`.`parameter_id` AS 'filter_id', COUNT(DISTINCT `cargo`.`cargo_id`) AS 'count' 
FROM `parameter`, `cargoparameter`, `cargo` LEFT JOIN `cargo` AS `child` ON `cargo`.`cargo_id`=`child`.`cargo_parent_id` 
WHERE `parameter`.`parameter_id`=`cargoparameter`.`cargoparameter_parameter_id` 
AND `parameter`.`parameter_parametertype_id` IS NOT NULL 
AND (`cargoparameter`.`cargoparameter_cargo_id`=`cargo`.`cargo_id` OR `cargoparameter`.`cargoparameter_cargo_id`=`child`.`cargo_id`) 
AND `cargo`.`cargo_category_id`='167' 
AND `cargo`.`cargo_publish`='1' 
AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL) 
GROUP BY `parameter`.`parameter_id` 
HAVING `count` > 1 
ORDER BY `count` DESC, `parameter`.`parameter_name` ASC 
LIMIT 0,15
...
Рейтинг: 0 / 0
04.08.2014, 13:19:23
    #38712064
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
vas-e-naJOIN заменить на неявный (т.к. анализ показал что так быстрее)Вашему анализу показалось. А вот что он забыл показать - так это то, что на разных версиях MySQL можно получить разный результат или даже синтаксическую ошибку на ровном месте. Правда, такие версии вроде бы уже вышли из обращения, но зарекаться я бы не стал.
...
Рейтинг: 0 / 0
04.08.2014, 13:21:01
    #38712068
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
vas-e-na
Код: plsql
1.
AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL) 

Поясните логику этого фрагмента.
...
Рейтинг: 0 / 0
04.08.2014, 13:23:03
    #38712074
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
miksoft,

оно иднт в такой связке:
Код: plsql
1.
2.
AND `cargo`.`cargo_publish`='1' 
AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL) 


смысл в том чтобы был опубликован и родительский и дочерний товар, при его наличии (дочернего)
...
Рейтинг: 0 / 0
04.08.2014, 13:30:35
    #38712089
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
vas-e-na,

План запроса и DDL таблиц со всеми индексами покажите.
...
Рейтинг: 0 / 0
04.08.2014, 14:20:19
    #38712154
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
miksoft,

Я так понял это нужно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
--
-- Структура таблицы `cargo`
--

CREATE TABLE IF NOT EXISTS `cargo` (
  `cargo_id` int(11) NOT NULL AUTO_INCREMENT,
  `cargo_parent_id` int(11) DEFAULT NULL,
  `cargo_manufacturer_id` int(11) DEFAULT NULL,
  `cargo_category_id` int(11) DEFAULT NULL,
  `cargo_currency_id` int(11) DEFAULT NULL,
  `cargo_cargounit_id` int(11) DEFAULT NULL,
  `cargo_directbanner_id` int(11) DEFAULT NULL,
  `cargo_name` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `cargo_sku` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `cargo_price_min` decimal(12,5) NOT NULL DEFAULT '0.00000',
  `cargo_price_max` decimal(12,5) NOT NULL DEFAULT '0.00000',
  `cargo_price_shipping` decimal(12,5) NOT NULL DEFAULT '0.00000',
  `cargo_percent_extra` decimal(5,2) NOT NULL DEFAULT '0.00',
  `cargo_percent_discount` decimal(5,2) NOT NULL DEFAULT '0.00',
  `cargo_description_short` varchar(8192) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `cargo_description_full` varchar(8192) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `cargo_stock` int(11) NOT NULL DEFAULT '0',
  `cargo_publish` tinyint(4) NOT NULL DEFAULT '0',
  `cargo_noindex` tinyint(4) NOT NULL DEFAULT '0',
  `cargo_flag_market` tinyint(4) NOT NULL DEFAULT '0',
  `cargo_flag_direct` tinyint(4) NOT NULL DEFAULT '0',
  `cargo_hits` bigint(20) NOT NULL DEFAULT '0',
  `cargo_market_model_id` int(11) DEFAULT NULL,
  `cargo_direct_title` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `cargo_direct_keywords` varchar(1024) COLLATE utf8_unicode_ci NOT NULL DEFAULT '{}',
  `cargo_parse` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`cargo_id`),
  UNIQUE KEY `cargo_sku` (`cargo_sku`),
  UNIQUE KEY `cargo_market_model_id` (`cargo_market_model_id`),
  KEY `cargo_parent_id` (`cargo_parent_id`),
  KEY `cargo_manufacturer_id` (`cargo_manufacturer_id`),
  KEY `cargo_category_id` (`cargo_category_id`),
  KEY `cargo_currency_id` (`cargo_currency_id`),
  KEY `cargo_cargounit_id` (`cargo_cargounit_id`),
  KEY `cargo_directbanner_id` (`cargo_directbanner_id`),
  KEY `cargo_publish` (`cargo_publish`),
  KEY `cargo_noindex` (`cargo_noindex`),
  KEY `cargo_flag_market` (`cargo_flag_market`),
  KEY `cargo_flag_direct` (`cargo_flag_direct`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7103 ;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--
-- Структура таблицы `parameter`
--

CREATE TABLE IF NOT EXISTS `parameter` (
  `parameter_id` int(11) NOT NULL AUTO_INCREMENT,
  `parameter_parametertype_id` int(11) DEFAULT NULL,
  `parameter_name` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `parameter_type` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`parameter_id`),
  KEY `parameter_type` (`parameter_type`),
  KEY `parameter_parametertype_id` (`parameter_parametertype_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=654 ;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--
-- Структура таблицы `cargoparameter`
--

CREATE TABLE IF NOT EXISTS `cargoparameter` (
  `cargoparameter_id` int(11) NOT NULL AUTO_INCREMENT,
  `cargoparameter_cargo_id` int(11) DEFAULT NULL,
  `cargoparameter_parameter_id` int(11) DEFAULT NULL,
  `cargoparameter_value` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`cargoparameter_id`),
  KEY `cargoparameter_cargo_id` (`cargoparameter_cargo_id`),
  KEY `cargoparameter_parameter_id` (`cargoparameter_parameter_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=90605 ;



Как-то так:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE parameter ALL PRIMARY parameter_parametertype_id NULL NULL NULL 646 Using where; Using temporary; Using filesort1 SIMPLE cargoparameter ref cargoparameter_cargo_id cargoparameter_parameter_i... cargoparameter_parameter_id 5 test.parameter.parameter_id 27 Using where1 SIMPLE cargo index_merge PRIMARY cargo_category_id cargo_publish cargo_category_id cargo_publish 5;1 NULL 35 Using intersect(cargo_category_id cargo_publish); ...1 SIMPLE child ref cargo_parent_id cargo_parent_id 5 test.cargo.cargo_id 2893 Using where
...
Рейтинг: 0 / 0
04.08.2014, 16:29:21
    #38712344
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
Ребят, есть идеи???
...
Рейтинг: 0 / 0
04.08.2014, 17:31:53
    #38712426
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
vas-e-na
Код: plsql
1.
AND (`cargoparameter`.`cargoparameter_cargo_id`=`cargo`.`cargo_id` OR `cargoparameter`.`cargoparameter_cargo_id`=`child`.`cargo_id`)

вот это, по-моему, вообще "не в дугу"
вам 2 раза нужно параметры цеплять - один раз к карго, второй к чайлдам
а как есть - это вообще хрен пойми что получается
...
Рейтинг: 0 / 0
05.08.2014, 10:31:14
    #38712774
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
tanglir,

В общем пока решил проблему так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT `parameter`.`parameter_id` AS 'filter_id', COUNT(DISTINCT `cargoparameter`.`cargoparameter_cargo_id`) AS 'count' 
FROM `parameter` LEFT JOIN `cargoparameter` ON `parameter`.`parameter_id`=`cargoparameter`.`cargoparameter_parameter_id` 
WHERE `parameter`.`parameter_parametertype_id` IS NOT NULL 
AND (EXISTS (
SELECT 1 FROM `cargo` LEFT JOIN `cargo` AS `child` ON `cargo`.`cargo_id`=`child`.`cargo_parent_id` 
WHERE `cargo`.`cargo_category_id`='11' AND `cargo`.`cargo_publish`='1' 
AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL) 
AND `cargoparameter`.`cargoparameter_cargo_id`=`cargo`.`cargo_id`) 
OR EXISTS (
SELECT 1 FROM `cargo` LEFT JOIN `cargo` AS `child` ON `cargo`.`cargo_id`=`child`.`cargo_parent_id` 
WHERE `cargo`.`cargo_category_id`='11' AND `cargo`.`cargo_publish`='1' 
AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL) 
AND `cargoparameter`.`cargoparameter_cargo_id`=`child`.`cargo_id`)) 
GROUP BY `parameter`.`parameter_id` HAVING `count` > 1 ORDER BY `count` DESC, `parameter`.`parameter_name` ASC LIMIT 0,15;



Но если кто-то подскажет как еще можно оптимизировать запрос буду рад

PS tanglir, спасибо за подсказку
...
Рейтинг: 0 / 0
05.08.2014, 12:20:01
    #38712899
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
vas-e-na,

а зачем ЛЕФТ джойн с каргопараметрами в основном запросе, если потом эта таблица участвует в условиях экзист-запросов? у вас карго_ид могут быть нуллами? :)
...
Рейтинг: 0 / 0
05.08.2014, 12:27:43
    #38712914
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
+Бредовая идея давать полям таблицы префикс, совпадающий с именем таблицы. Зачем писать одно и то же дважды?
vas-e-naсмысл в том чтобы был опубликован и родительский и дочерний товар, при его наличии (дочернего)а в чём вообще смысл запроса?
Выбрать все параметры, которые относятся к опубликованным товарам (определённой категории), у которых либо нет прямых потомков, либо есть {все|хотя бы один|?} опубликованный прямой потомок? к каждому параметру ещё вывести количество самих товаров. Так?
...
Рейтинг: 0 / 0
05.08.2014, 12:31:06
    #38712916
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
И вообще я, похоже, чего-то не понимаю. Зачем в запросе 2 абсолютно одинаковых экзиста?
...
Рейтинг: 0 / 0
05.08.2014, 13:21:02
    #38712981
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
tanglir,
tanglirа зачем ЛЕФТ джойн с каргопараметрами в основном запросе, если потом эта таблица участвует в условиях экзист-запросов?
Не совсем понял вопроса
tanglirу вас карго_ид могут быть нуллами?
cargo.cargo_id - всегда не NULL
child.cargo_id - может быть NULL
tanglirВыбрать все параметры, которые относятся к опубликованным товарам (определённой категории), у которых либо нет прямых потомков, либо есть {все|хотя бы один|?} опубликованный прямой потомок? к каждому параметру ещё вывести количество самих товаров. Так?
да
tanglirИ вообще я, похоже, чего-то не понимаю. Зачем в запросе 2 абсолютно одинаковых экзиста?
один на родиля условие, второй на ребенка условие. так что они немного разные. но если объединить в один exists с OR то будет выполнятся дольше
...
Рейтинг: 0 / 0
05.08.2014, 13:36:28
    #38713010
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
vas-e-naтак что они немного разныеони совпадают с точностью до символа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
EXISTS (
SELECT 1 FROM `cargo` 
LEFT JOIN `cargo` AS `child` ON `cargo`.`cargo_id`=`child`.`cargo_parent_id` 
WHERE `cargo`.`cargo_category_id`='11' AND `cargo`.`cargo_publish`='1' 
 AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL)
 AND `cargoparameter`.`cargoparameter_cargo_id`=`cargo`.`cargo_id`
) 
OR EXISTS (
SELECT 1 FROM `cargo` 
LEFT JOIN `cargo` AS `child` ON `cargo`.`cargo_id`=`child`.`cargo_parent_id` 
WHERE `cargo`.`cargo_category_id`='11' AND `cargo`.`cargo_publish`='1'
 AND (`child`.`cargo_publish`='1' OR `child`.`cargo_id` IS NULL)
 AND `cargoparameter`.`cargoparameter_cargo_id`=`child`.`cargo_id`
)


vas-e-natanglirВыбрать все параметры, которые относятся к опубликованным товарам (определённой категории), у которых либо нет прямых потомков, либо есть {все|хотя бы один|?} опубликованный прямой потомок? к каждому параметру ещё вывести количество самих товаров. Так?да-Приборы!
-18!
-Что "18"?
-А что "приборы"?

Если есть 2 потомка (не "сын" и "внук", а 2 "сына"), один опубликован, второй нет - это "правильный" товар?
Если товар подходит по параметрам, а потомок не подходит - это "правильный" товар?
Если товар подходит по параметрам, первый потомок подходит, а второй нет - это "правильный" товар?
Ну и так далее :) Ставьте задачу чётко, решения могут сильно различаться.
...
Рейтинг: 0 / 0
05.08.2014, 13:40:09
    #38713015
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
tanglirони совпадают с точностью до символаой
только сейчас увидел, где разница
прошу прощения
...
Рейтинг: 0 / 0
05.08.2014, 15:20:30
    #38713164
vas-e-na
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
tanglir,

Соответсвенно поясню критерии отбора:
Товары должны быть всегда опубликованы. (таблица cargo)
В случае наличия детей хотя бы один ребенок должен быть опубликован (таблица child)
Характеристика должна принадлежать либо к родительскому товару, либо к дочернему (у обоих не может быть одной одинаковой характеристики одновременно)
Все доп фильтры типа категории применяются только к родительскому товару, т.к. по структуре дочерний их наследует (как и родительские характеристики)

Учтите что это условия для данного конкретного запроса, в зависимости от ситуации критерии могут изменится, но суть останется той же: Найти характеристики которые есть у товаров попадающих под фильтр учитывая что дочернему товару соответсвуют характеристики родительского.
...
Рейтинг: 0 / 0
05.08.2014, 18:53:18
    #38713408
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL тормозит на стадии "Copying to tmp table"
сначала тупо найти все ид товаров, удовлетворяющих характеристике и попадающих под фильтр - безо всяких подзапросов на дочерние и т.п.
потом из полученного списка ид товаров получить ид их родителей и таким же образом их отфильтровать
потом UNION этих двух списков ид и подсчёт кол-ва товаров на характеристику
будет ли это быстрее, чем 2 экзиста на каждую строку - вопрос, но попробовать имхо стоит
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL тормозит на стадии "Copying to tmp table" / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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