Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос тормозит при добавлении джойнов / 16 сообщений из 16, страница 1 из 1
29.07.2014, 01:34:00
    #38707698
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
Звучит конечно глуповато, но по сути полностью отражает ситуацию.

Вот сам запрос:

Код: 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.
            SELECT p.product_id,
                   p.stock_status_id,
                   (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1') AS rating
              FROM product p 
                   LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) 
                   INNER JOIN product_to_value p2v1 ON (p.product_id = p2v1.product_id) 
                   INNER JOIN product_to_value p2v2 ON (p.product_id = p2v2.product_id) 
                   INNER JOIN product_to_value p2v3 ON (p.product_id = p2v3.product_id) 
                   INNER JOIN product_to_value p2v4 ON (p.product_id = p2v4.product_id) 
                   INNER JOIN product_to_value p2v5 ON (p.product_id = p2v5.product_id) 
                   INNER JOIN product_to_value p2v6 ON (p.product_id = p2v6.product_id) 
                   INNER JOIN product_to_value p2v7 ON (p.product_id = p2v7.product_id) 
                   INNER JOIN product_to_value p2v8 ON (p.product_id = p2v8.product_id) 
            WHERE p.status = '1'
              AND p.date_available <= '2014-07-28 20:42:00'
                    AND (p2c.category_id = '125')
          AND p2v1.value_id IN (29,31)
          AND p2v2.value_id IN (70,72)
          AND p2v3.value_id IN (74,75)
          AND p2v4.value_id IN (77,79,81)
          AND p2v5.value_id IN (86,499)
          AND p2v6.value_id IN (485,487)
          AND p2v7.value_id IN (97)
          AND p2v8.value_id IN (336,480)
            GROUP BY p.product_id
                    ORDER BY if(p.stock_status_id = 9, p.stock_status_id, NULL) ASC,
                             if(p.stock_status_id = 5, p.stock_status_id, NULL) ASC,
                             if(p.quantity = 0, p.quantity, NULL) ASC,
                             p.quantity ;

Выполняется он целых 500ms, что для меня долговато. Мне надо в пределах 5ms.

Статистика по таблицам:
* product - около 1,200 записей
* product_to_category - 1,500 записей
* review - около 2,000 записей
* product_to_value - 6,600 записей

Т.е. в общем и целом база небольшая, но почему так долго выполняется запрос - непонятно. Более того, если от него отрезать чуть-чуть, например последние два джойна с соответствующими условиями, то будет уже 21ms, что в 40 раз меньше. Аналогично, отрезав 3 условия, мы получаем уже 4ms вместо 500, что уже смахивает на приемлемый результат.

Я как бы понимаю что джойны это плохо, но другого варианта запроса я придумать не могу. Я увеличивал join_buffer_size до 8M - эффекта нет. Ставил и 16M - пофиг. Значит дело не в памяти. Но в чем тогда?

explain ничего интересного не говорит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+--------------------+-------+--------+---------------------+------------+---------+------------------------------+------+-----------------------------------------------------------+
| id | select_type        | table | type   | possible_keys       | key        | key_len | ref                          | rows | Extra                                                     |
+----+--------------------+-------+--------+---------------------+------------+---------+------------------------------+------+-----------------------------------------------------------+
|  1 | PRIMARY            | p2v4  | range  | PRIMARY,vp,pv       | vp         | 4       | NULL                         |    9 | Using where; Using index; Using temporary; Using filesort |
|  1 | PRIMARY            | p2c   | eq_ref | PRIMARY,category_id | PRIMARY    | 8       | forter.p2v4.product_id,const |    1 | Using where; Using index                                  |
|  1 | PRIMARY            | p2v7  | ref    | PRIMARY,vp,pv       | PRIMARY    | 8       | forter.p2v4.product_id,const |    1 | Using index                                               |
|  1 | PRIMARY            | p2v1  | ref    | PRIMARY,vp,pv       | pv         | 4       | forter.p2c.product_id        |   10 | Using where; Using index                                  |
|  1 | PRIMARY            | p2v5  | ref    | PRIMARY,vp,pv       | pv         | 4       | forter.p2c.product_id        |   10 | Using where; Using index                                  |
|  1 | PRIMARY            | p2v6  | ref    | PRIMARY,vp,pv       | pv         | 4       | forter.p2v5.product_id       |   10 | Using where; Using index                                  |
|  1 | PRIMARY            | p2v3  | ref    | PRIMARY,vp,pv       | pv         | 4       | forter.p2v6.product_id       |   10 | Using where; Using index                                  |
|  1 | PRIMARY            | p2v2  | ref    | PRIMARY,vp,pv       | pv         | 4       | forter.p2v7.product_id       |   10 | Using where; Using index                                  |
|  1 | PRIMARY            | p2v8  | ref    | PRIMARY,vp,pv       | pv         | 4       | forter.p2v3.product_id       |   10 | Using where; Using index                                  |
|  1 | PRIMARY            | p     | eq_ref | PRIMARY,status      | PRIMARY    | 4       | forter.p2v6.product_id       |    1 | Using where                                               |
|  2 | DEPENDENT SUBQUERY | r1    | ref    | product_id          | product_id | 4       | func                         |    3 | Using where                                               |
+----+--------------------+-------+--------+---------------------+------------+---------+------------------------------+------+-----------------------------------------------------------+

А вот профайлинг говорит что запрос почти все свое время проторчал на статистике;

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000005
Opening tables 0.000051
System lock 0.000014
Waiting for query cache lock 0.000045
init 0.000088
optimizing 0.000029
statistics 0.487855  <<<<<< вот что это такое?
preparing 0.000072
Creating tmp table 0.000031
executing 0.000005
Copying to tmp table 0.000138
optimizing 0.000015
statistics 0.000018
preparing 0.000010
executing 0.000006
Sending data 0.000061
executing 0.000005
Sending data 0.000052
executing 0.000005
Sending data 0.000018
executing 0.000005
Sending data 0.000037
executing 0.000005
Sending data 0.000014
executing 0.000004
Sending data 0.000107
Sorting result 0.000020
Sending data 0.000016
end 0.000005
removing tmp table 0.000024
end 0.000007
query end 0.000005
closing tables 0.000014
freeing items 0.000017
Waiting for query cache lock 0.000005
freeing items 0.000021
Waiting for query cache lock 0.000004
freeing items 0.000005
storing result in query cache 0.000006
logging slow query 0.000004
cleaning up 0.000017


Ну и наконец таблички:

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
CREATE TABLE `product` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `model` varchar(64) NOT NULL,
  `is_cheaper` int(1) NOT NULL DEFAULT '0',
  `sku` varchar(64) NOT NULL,
  `upc` varchar(12) NOT NULL,
  `location` varchar(128) NOT NULL,
  `quantity` int(4) NOT NULL DEFAULT '0',
  `stock_status_id` int(11) NOT NULL,
  `image` varchar(255) DEFAULT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `shipping` tinyint(1) NOT NULL DEFAULT '1',
  `price` decimal(15,4) NOT NULL DEFAULT '0.0000',
  `super_price` tinyint(4) NOT NULL DEFAULT '0',
  `super_price_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `top_sale` tinyint(4) NOT NULL DEFAULT '0',
  `top_sale_end` date NOT NULL DEFAULT '0000-00-00',
  `payment_by_parts` tinyint(1) NOT NULL DEFAULT '0',
  `points` int(8) NOT NULL DEFAULT '0',
  `tax_class_id` int(11) NOT NULL,
  `date_available` date NOT NULL,
  `weight` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `weight_class_id` int(11) NOT NULL DEFAULT '0',
  `length` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `width` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `height` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `length_class_id` int(11) NOT NULL DEFAULT '0',
  `subtract` tinyint(1) NOT NULL DEFAULT '1',
  `minimum` int(11) NOT NULL DEFAULT '1',
  `sort_order` int(11) NOT NULL DEFAULT '0',
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `viewed` int(5) NOT NULL DEFAULT '0',
  `installation` tinyint(1) NOT NULL DEFAULT '0',
  `price_uah` decimal(15,4) unsigned NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`product_id`),
  KEY `model` (`model`),
  KEY `quantity` (`quantity`),
  KEY `stock_status_id` (`stock_status_id`),
  KEY `manufacturer_id` (`manufacturer_id`),
  KEY `weight` (`weight`,`weight_class_id`),
  KEY `length` (`length`,`width`,`height`),
  KEY `height` (`height`,`length_class_id`),
  KEY `status` (`status`)
) ENGINE=MyISAM AUTO_INCREMENT=1397 DEFAULT CHARSET=utf8;

CREATE TABLE `review` (
  `review_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `customer_id` int(11) NOT NULL,
  `author` varchar(64) NOT NULL DEFAULT '',
  `text` text NOT NULL,
  `rating` int(1) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`review_id`),
  KEY `product_id` (`product_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1957 DEFAULT CHARSET=utf8;

REATE TABLE `product_to_category` (
  `product_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `main_category` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`product_id`,`category_id`),
  KEY `category_id` (`category_id`),
  KEY `main_category` (`main_category`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `product_to_value` (
  `product_id` int(11) NOT NULL,
  `value_id` int(11) NOT NULL,
  `option_id` int(11) NOT NULL,
  PRIMARY KEY (`product_id`,`value_id`,`option_id`),
  KEY `vp` (`value_id`,`product_id`),
  KEY `pv` (`product_id`,`value_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
...
Рейтинг: 0 / 0
29.07.2014, 02:11:43
    #38707703
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
soforp
Код: plaintext
Using temporary; Using filesort
Оно как бы и не должно быстро работать. Попробуйте избавиться от этого.
...
Рейтинг: 0 / 0
29.07.2014, 02:35:12
    #38707706
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
vkle,

Попробовал оптимизировать выборку:

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
SELECT p.product_id,
       p.stock_status_id,
       (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1') AS rating
FROM product p 
WHERE p.product_id in (
   SELECT p1.product_id 
     FROM product p1 
          LEFT JOIN product_to_value p2v1 ON ( p1.product_id = p2v1.product_id) 
          LEFT JOIN product_to_category p2c1 ON ( p1.product_id = p2c1.product_id) 
    WHERE p2c1.category_id = '125' 
      AND p2v1.value_id IN (29,31)
)
 AND p.product_id in (
   SELECT p2.product_id 
     FROM product p2 
          LEFT JOIN product_to_value p2v2 ON ( p2.product_id = p2v2.product_id) 
          LEFT JOIN product_to_category p2c2 ON ( p2.product_id = p2c2.product_id) 
    WHERE p2c2.category_id = '125' 
      AND p2v2.value_id IN (70,72)
)
 AND p.product_id in (
   SELECT p3.product_id 
     FROM product p3 
          LEFT JOIN product_to_value p2v3 ON ( p3.product_id = p2v3.product_id) 
          LEFT JOIN product_to_category p2c3 ON ( p3.product_id = p2c3.product_id) 
    WHERE p2c3.category_id = '125' 
      AND p2v3.value_id IN (74,75)
)
 AND p.product_id in (
   SELECT p4.product_id 
     FROM product p4 
          LEFT JOIN product_to_value p2v4 ON ( p4.product_id = p2v4.product_id) 
          LEFT JOIN product_to_category p2c4 ON ( p4.product_id = p2c4.product_id) 
    WHERE p2c4.category_id = '125' 
      AND p2v4.value_id IN (77,79,81)
)
 AND p.product_id in (
   SELECT p5.product_id 
     FROM product p5 
          LEFT JOIN product_to_value p2v5 ON ( p5.product_id = p2v5.product_id) 
          LEFT JOIN product_to_category p2c5 ON ( p5.product_id = p2c5.product_id) 
    WHERE p2c5.category_id = '125' 
      AND p2v5.value_id IN (86,499)
)
 AND p.product_id in (
   SELECT p6.product_id 
     FROM product p6 
          LEFT JOIN product_to_value p2v6 ON ( p6.product_id = p2v6.product_id) 
          LEFT JOIN product_to_category p2c6 ON ( p6.product_id = p2c6.product_id) 
    WHERE p2c6.category_id = '125' 
      AND p2v6.value_id IN (485,487)
)
 AND p.product_id in (
   SELECT p7.product_id 
     FROM product p7 
          LEFT JOIN product_to_value p2v7 ON ( p7.product_id = p2v7.product_id) 
          LEFT JOIN product_to_category p2c7 ON ( p7.product_id = p2c7.product_id) 
    WHERE p2c7.category_id = '125' 
      AND p2v7.value_id IN (97)
)
 AND p.product_id in (
   SELECT p8.product_id 
     FROM product p8 
          LEFT JOIN product_to_value p2v8 ON ( p8.product_id = p2v8.product_id) 
          LEFT JOIN product_to_category p2c8 ON ( p8.product_id = p2c8.product_id) 
    WHERE p2c8.category_id = '125' 
      AND p2v8.value_id IN (336,480)
)
 AND p.status = '1'
 AND p.date_available <= '2014-07-28 20:42:00'
 ORDER BY if(p.stock_status_id = 9, p.stock_status_id, NULL) ASC,
       if(p.stock_status_id = 5, p.stock_status_id, NULL) ASC,
       if(p.quantity = 0, p.quantity, NULL) ASC,
       p.quantity 

Результат - 9ms

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
SELECT p.product_id,
       p.stock_status_id,
       (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1') AS rating
FROM product p 
     LEFT JOIN product_to_category p2c ON ( p.product_id = p2c.product_id) 
WHERE p.product_id in (
   SELECT p1.product_id 
     FROM product p1 
          LEFT JOIN product_to_value p2v1 ON ( p1.product_id = p2v1.product_id) 
    WHERE p2v1.value_id IN (29,31)
)
 AND p.product_id in (
   SELECT p2.product_id 
     FROM product p2 
          LEFT JOIN product_to_value p2v2 ON ( p2.product_id = p2v2.product_id)           
    WHERE p2v2.value_id IN (70,72)
)
 AND p.product_id in (
   SELECT p3.product_id 
     FROM product p3 
          LEFT JOIN product_to_value p2v3 ON ( p3.product_id = p2v3.product_id) 
    WHERE p2v3.value_id IN (74,75)
)
 AND p.product_id in (
   SELECT p4.product_id 
     FROM product p4 
          LEFT JOIN product_to_value p2v4 ON ( p4.product_id = p2v4.product_id)           
    WHERE p2v4.value_id IN (77,79,81)
)
 AND p.product_id in (
   SELECT p5.product_id 
     FROM product p5 
          LEFT JOIN product_to_value p2v5 ON ( p5.product_id = p2v5.product_id)           
    WHERE p2v5.value_id IN (86,499)
)
 AND p.product_id in (
   SELECT p6.product_id 
     FROM product p6 
          LEFT JOIN product_to_value p2v6 ON ( p6.product_id = p2v6.product_id)           
    WHERE p2v6.value_id IN (485,487)
)
 AND p.product_id in (
   SELECT p7.product_id 
     FROM product p7 
          LEFT JOIN product_to_value p2v7 ON ( p7.product_id = p2v7.product_id)           
    WHERE p2v7.value_id IN (97)
)
 AND p.product_id in (
   SELECT p8.product_id 
     FROM product p8 
          LEFT JOIN product_to_value p2v8 ON ( p8.product_id = p2v8.product_id)           
    WHERE p2v8.value_id IN (336,480)
)
 AND p2c.category_id = '125' 
 AND p.status = '1'
 AND p.date_available <= '2014-07-28 20:42:00'
 ORDER BY if(p.stock_status_id = 9, p.stock_status_id, NULL) ASC,
       if(p.stock_status_id = 5, p.stock_status_id, NULL) ASC,
       if(p.quantity = 0, p.quantity, NULL) ASC,
       p.quantity 

Результат - 2ms

Все запросы проверялись с SQL_NO_CACHE. Но все равно интересно знать что за статистика, потому что мне кажется что только в данной ситуации запросы выполнились быстро.
...
Рейтинг: 0 / 0
29.07.2014, 03:30:35
    #38707711
kixiro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
У вас explain по первому примеру показывает что при запросе используется файловая сортировка, а tmpdir находится в памяти или на диске? При tmpdir в памяти запрос из первого сообщения будет выполняться гораздо быстрее, особенно на большом объеме данных.
...
Рейтинг: 0 / 0
29.07.2014, 06:07:37
    #38707722
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
soforp ,

в первом СКЛ-е вы задолбали оптимизатор
похожими связками , смесью JOIN и WHERE,
некорректным использованием LEFT.

Оптимизатор mysql и так не шибко умный,
а тут еше и вы ему "не помогли" :-)

Вот он и задумался на полсекунды над перебором
всех вариантов подсоединения таблиц.
И, похоже, недоперебрал, вышел по
лимиту времени на переборе,
и выдал таксебейный план.

А во втором случае вы конкретно
навязали базе порядок выполнения.
И получили отличный результат!

Посему:

1. зачем вам много результатов так быстро?
у вас еше есть лимит 10 ? постраничный вывод?

2. постарайтесь не смешивать два стиля написания
связок .

3. запомните что ЛЕФТ не используют (в вашем случае)
если потом есть WHERE на эту таблицу

4. при большом количестве жоинтов имеет смысл
подсказать базе что делать.
например с использованием подселектое,
инлине вьюшек, STRAIGHT_JOIN, форсе индех.. .
Естествено -- при соответсвуюшем анализе
и тестировании . Вы провели хороший
пример оптимизации такого рода.

Ну и не сбивать с толку пунктами #2 и #3 выше.

5. Если рейтинги меняется не каждую секунду,
можно раз в час их пересчитывать
и хранить на продукте
( так называемая upstream / aggregate denormalization).
...
Рейтинг: 0 / 0
29.07.2014, 10:49:24
    #38707871
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
Спасибо за ответ. ПО рейтингам действительно есть идея денормализации, но пока они на скорость выборки никак не влияли - пробовал как с ними, так и без. Можно про left и where подробней?
...
Рейтинг: 0 / 0
29.07.2014, 11:52:55
    #38707964
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
soforpМожно про left и where подробней?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT <...>
FROM product p 
LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) 
<...>
WHERE p.status = '1'
 AND p.date_available <= '2014-07-28 20:42:00'
 AND (p2c.category_id = '125')
<...>

Лефт джойн говорит, что каждой строке из "п" будет соответствовать как минимум одна строка лезультата, пусть и с нулловыми значеними полей "п2ц".
В то же время все строки с нулловыми значеними полей "п2ц" отсеиваются выделенным условием. Спрашивается, зачем ЛЕФТ джойн? обычный сделает то же самое, зато оптимизатору будет проще.
...
Рейтинг: 0 / 0
29.07.2014, 17:40:06
    #38708415
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
On 29.07.2014 02:34, soforp wrote:
> Автор: soforp.

> Выполняется он целых 500ms, что для меня долговато. Мне надо в пределах 5ms.


Я хочу ещё добавить, что в принципе 500 ms -- это нормальное время
выполнения для запроса. Быстрое. 5 ms -- очень быстрое, и в реальных БД
практически не встречающееся.

Это никак не относится к вашему конкретному запросу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.07.2014, 17:44:30
    #38708426
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
автор

SELECT p.product_id,
p.stock_status_id,
(SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1') AS rating

GROUP BY p.product_id

группировка не по всем полям выборки.
...
Рейтинг: 0 / 0
29.07.2014, 20:18:37
    #38708534
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
ScareCrow,

ну тут группировка по ид и поля из той же таблицы, в данном случае это простительно
...
Рейтинг: 0 / 0
29.07.2014, 20:36:44
    #38708545
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
MasterZiv,

Прежде чем делать громкие заявления относительно "быстроты" запроса в 500мс нужно вспомнить что любое приложение выполняет сотни запросов к базе в процессе формирования 1 странички ( например блог или интернет магазин ). Теперь представим на минутку сколько бы формировалась страничка, если бы она состояла из таких "быстрых" запросов. Мне представлять не надо, у моего клиента страничка формировалась 6 минут :( . Но после оптимизации - 150мс и это отлично :)

В действительности же, быстрым можно назвать запрос, который выполняется быстрее чем за 1мс. 5мс - это компромисное время для таких монструозных запросов как мой. А запросы по одной табличке вообще должны выполняться менее чем за 1мс.
...
Рейтинг: 0 / 0
29.07.2014, 20:39:09
    #38708548
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
tanglir,

Да, действительно left join смотрится глупо в данном случае. Но вроде была еще разница между left\right и inner джойнами, заключающаяся в скорости выборки. Быстрое гугленье ничего не дало, эксперименты тоже, но если вспомню что и как - отпишу.
...
Рейтинг: 0 / 0
29.07.2014, 20:40:17
    #38708550
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
kixiro,

На диске, причем диск обычный саташный. Видимо поэтому аналогичный запрос на сервере с SSD дисками выполняется за 50мс при куда большем размере базы.
...
Рейтинг: 0 / 0
29.07.2014, 20:43:46
    #38708553
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
javajdbc,

да, лимит есть конечно же. Да и phpmyadmin без лимита запрос не отпустит на сервер. Можно еще чуть подробнее про смешение стилей связок?
...
Рейтинг: 0 / 0
29.07.2014, 21:10:48
    #38708569
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
soforp,

ну типа старый стиль:

select *
from t1, t2
where t1.p1 = t2.p2

select *
from t1, t2
where t1.p1 = t2.p2(+)

новый


select *
from t1 JOIN t2 ON t1.p1 = t2.p2

select *
from t1 LEFT JOIN t2 ON t1.p1 = t2.p2

смешаный стиль

select *
from t1 JOIN t2
where t1.p1 = t2.p2


я не помню чтобы кто-то ставил под сомнение
функциональную идентичность смешаного стиля,
но это мешает и чтению и, возможно, требует
большей работы оптимизатора.
...
Рейтинг: 0 / 0
29.07.2014, 21:32:20
    #38708577
soforp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос тормозит при добавлении джойнов
javajdbc,

хм. Я обычно в ON пишу условие для связи между таблицами ( поле = поле ), а в WHERE условие фильтрации по итоговым таблицам ( поле оператор константа ). Разве это смешение?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос тормозит при добавлении джойнов / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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