anonymous@RULINUX.NET~# Last login: 2024-12-27 00:10:36
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[mysql] перфомансы и погромисты

Есть у меня один клиент с магазином всякого-всякого.

Двиг магазина какой-то самописный, где хозяйничает у него свой погромист, который все это дело, соответственно погромирует.

И есть у него один презабавный запрос в мускуле (innodb), который любит забивать всю работу мускуля к херам:

sql
mysql> SELECT og.goods_sn num_iid, SUM(og.goods_number) AS goods_number FROM `ecs_taobaosruruorder_info` AS o, `ecs_taobaosruruorder_goods` AS og WHERE 1  GROUP BY og.goods_sn ORDER BY goods_number DESC;
 


Запрос возвращает чуть больше 5к строк и иногда выполняется по 14 секунд, иногда по 30.

sql
mysql> DESC ecs_taobaosruruorder_goods;
+----------------+-----------------------+------+-----+---------+----------------+
| FIELD          | Type                  | NULL | KEY | DEFAULT | Extra          |
+----------------+-----------------------+------+-----+---------+----------------+
| rec_id         | mediumint(8) UNSIGNED | NO   | PRI | NULL    | AUTO_INCREMENT |
| order_id       | mediumint(8) UNSIGNED | NO   |     | 0       |                |
| goods_id       | bigint(20)            | YES  |     | NULL    |                |
| goods_name     | varchar(120)          | NO   |     |         |                |
| goods_sn       | varchar(60)           | NO   | MUL |         |                |
| product_id     | mediumint(8) UNSIGNED | NO   |     | 0       |                |
| goods_number   | smallint(5) UNSIGNED  | NO   | MUL | 1       |                |
| market_price   | decimal(10,2)         | NO   |     | 0.00    |                |
| goods_price    | decimal(10,2)         | NO   |     | 0.00    |                |
| goods_attr     | text                  | NO   |     | NULL    |                |
| send_number    | smallint(5) UNSIGNED  | NO   |     | 0       |                |
| is_real        | tinyint(1) UNSIGNED   | NO   |     | 0       |                |
| extension_code | varchar(30)           | NO   |     |         |                |
| parent_id      | mediumint(8) UNSIGNED | NO   |     | 0       |                |
| is_gift        | smallint(5) UNSIGNED  | NO   |     | 0       |                |
| goods_attr_id  | varchar(255)          | NO   |     |         |                |
| comment        | text                  | YES  |     | NULL    |                |
| trackcode      | varchar(50)           | YES  |     | NULL    |                |
| goods_status   | varchar(50)           | YES  |     | NULL    |                |
| goods_attr_val | varchar(255)          | YES  |     | NULL    |                |
| goods_thumb    | varchar(255)          | YES  |     | NULL    |                |
+----------------+-----------------------+------+-----+---------+----------------+
21 rows IN SET (0.00 sec)
 


Смотрим, как по учебнику

sql
mysql> EXPLAIN EXTENDED SELECT og.goods_sn num_iid, SUM(og.goods_number) AS goods_number FROM `ecs_taobaosruruorder_info` AS o, `ecs_taobaosruruorder_goods` AS og WHERE 1  GROUP BY og.goods_sn ORDER BY goods_number DESC;
+----+-------------+-------+-------+---------------+--------------+---------+------+------+----------+----------------------------------------------+
| id | select_type | TABLE | type  | possible_keys | KEY          | key_len | ref  | rows | filtered | Extra                                        |
+----+-------------+-------+-------+---------------+--------------+---------+------+------+----------+----------------------------------------------+
|  1 | SIMPLE      | o     | INDEX | NULL          | order_status | 1       | NULL | 1421 |   100.00 | USING INDEX; USING TEMPORARY; USING filesort |
|  1 | SIMPLE      | og    | ALL   | NULL          | NULL         | NULL    | NULL | 8030 |   100.00 | USING JOIN buffer                            |
+----+-------------+-------+-------+---------------+--------------+---------+------+------+----------+----------------------------------------------+
2 rows IN SET, 1 warning (0.00 sec)
 


Так и не понял, какого хрена не используется ни один индекс для талбицы ecs_taobaosruruorder_goods. но если мне память не изменяет, то SUM() как бы должен ответить на этот вопрос кэпом.

ОК, идем дальше:

sql
mysql> SET profiling=1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT SQL_NO_CACHE og.goods_sn num_iid, SUM(og.goods_number) AS goods_number FROM `ecs_taobaosruruorder_info` AS o, `ecs_taobaosruruorder_goods` AS og WHERE 1  GROUP BY og.goods_sn ORDER BY goods_number DESC;

+-------------+--------------+
| num_iid     | goods_number |
+-------------+--------------+
| 9566256455  |       154889 |
| 9300994544  |        80997 |
| 14471064410 |        71050 |

......

| 15555915336 |            0 |
| 14973389548 |            0 |
| 12264019380 |            0 |
| 16190905553 |            0 |
| 14334037357 |            0 |
+-------------+--------------+
5039 rows IN SET (14.13 sec)

mysql> SHOW profile FOR query 5;
+----------------------+-----------+
| STATUS               | Duration  |
+----------------------+-----------+
| starting             |  0.000063 |
| checking permissions |  0.000005 |
| checking permissions |  0.000005 |
| Opening TABLES       |  0.000020 |
| System LOCK          |  0.000010 |
| init                 |  0.000017 |
| optimizing           |  0.000006 |
| statistics           |  0.000010 |
| preparing            |  0.000022 |
| Creating tmp TABLE   |  0.000030 |
| executing            |  0.000004 |
| Copying TO tmp TABLE | 14.129446 |
| Sorting result       |  0.001820 |
| Sending DATA         |  0.001436 |
| end                  |  0.000005 |
| removing tmp TABLE   |  0.000115 |
| end                  |  0.000005 |
| query end            |  0.000003 |
| closing TABLES       |  0.000007 |
| freeing items        |  0.000010 |
| logging slow query   |  0.000003 |
| logging slow query   |  0.000040 |
| cleaning up          |  0.000004 |
+----------------------+-----------+
23 rows IN SET (0.00 sec)
 


да, кеш я отключил специально. Но что за нафиг и пчему так долго копичет в tmp_table? Особенно учитывая тот факт, что tmpdir уже хз сколько успешно сидит на tmpfs и ниразу не вылазит на диск - места ему хватает.

vitroot(*) (2013-02-21 17:24:28)

Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] перфомансы и погромисты от vitroot 2013-02-21 17:24:28Фильтры
avatar
  • матерные выражения
Скрыть

Re:[mysql] перфомансы и погромисты

Мусколь просто ни хуя не понял чего от него хотел этот "погромист", и по этому на всякий случай решил не включать индексы))) Я собственно тоже не понял, даже интересно зачем может понадобиться такой запрос)))

Ax-Xa-Xa(*)(2013-02-21 19:01:48)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] перфомансы и погромисты от vitroot 2013-02-21 17:24:28
avatar
Скрыть

Re:[mysql] перфомансы и погромисты

> SELECT og.goods_sn num_iid, SUM(og.goods_number) AS goods_number FROM `ecs_taobaosruruorder_info` AS o, `ecs_taobaosruruorder_goods` AS og WHERE 1 GROUP BY og.goods_sn ORDER BY goods_number DESC;

Это декартово произведение?

> Так и не понял, какого хрена не используется ни один индекс для талбицы ecs_taobaosruruorder_goods

Если нет условия выборки - то один хрен читать все строки. Любая БД сообразит что читать ещё и индексы - только преумножать IO без какой-либо пользы.

anonymous(*)(2013-02-21 22:11:46)

Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!