Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему select max(id),id на порядок дольше, чем select max(id) ? / 11 сообщений из 11, страница 1 из 1
03.06.2014, 18:11:45
    #38660530
Pilsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
есть такая таблица:
Код: 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.
mysql> show fields from boar_mxids;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| tid     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| id      | int(9) unsigned  | NO   | MUL | NULL    |                |
| mid     | int(10) unsigned | NO   | MUL | NULL    |                |
| pref    | int(4) unsigned  | NO   |     | NULL    |                |
| mid_ind | int(9) unsigned  | NO   |     | 0       |                |
+---------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> show index from boar_mxids;
+------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name          | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| boar_mxids |          0 | PRIMARY           |            1 | tid         | A         |   132817574 |     NULL | NULL   |      | BTREE      |         |               |
| boar_mxids |          0 | index_mid_id      |            1 | mid         | A         |    66408787 |     NULL | NULL   |      | BTREE      |         |               |
| boar_mxids |          0 | index_mid_id      |            2 | id          | A         |   132817574 |     NULL | NULL   |      | BTREE      |         |               |
| boar_mxids |          1 | index_id          |            1 | id          | A         |   132817574 |     NULL | NULL   |      | BTREE      |         |               |
| boar_mxids |          1 | index_mid_mid_ind |            1 | mid         | A         |   132817574 |     NULL | NULL   |      | BTREE      |         |               |
| boar_mxids |          1 | index_mid_mid_ind |            2 | mid_ind     | A         |   132817574 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
6 rows in set (0.32 sec)



Выполняю 2 запроса и вижу дикую разницу по времени:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
mysql> SELECT max(mid_ind) as mid_ind FROM `boar_mxids` `t` WHERE mid=5;

+----------+
| mid_ind  |
+----------+
| 24974726 |
+----------+
1 row in set (0.01 sec)

mysql> SELECT max(mid_ind),mid as mid_ind FROM `boar_mxids` `t` WHERE mid=5;
+--------------+---------+
| max(mid_ind) | mid_ind |
+--------------+---------+
|     24974726 |       5 |
+--------------+---------+
1 row in set (18.28 sec) 




теперь смотрим explain:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
mysql> explain SELECT max(mid_ind) as mid_ind FROM `boar_mxids` `t` WHERE mid=5;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
1 row in set (0.03 sec)

mysql> explain SELECT max(mid_ind),mid as mid_ind FROM `boar_mxids` `t` WHERE mid=5;
+----+-------------+-------+------+--------------------------------+-------------------+---------+-------+----------+-------------+
| id | select_type | table | type | possible_keys                  | key               | key_len | ref   | rows     | Extra       |
+----+-------------+-------+------+--------------------------------+-------------------+---------+-------+----------+-------------+
|  1 | SIMPLE      | t     | ref  | index_mid_id,index_mid_mid_ind | index_mid_mid_ind | 4       | const | 47917900 | Using index |
+----+-------------+-------+------+--------------------------------+-------------------+---------+-------+----------+-------------+
1 row in set (0.00 sec)



подскажите, откуда такая разница? как это можно оптимизировать?

почему же select max(),id выполняется в тысячи раз медленнее, чем select max() ?
...
Рейтинг: 0 / 0
03.06.2014, 18:17:15
    #38660538
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
...
Рейтинг: 0 / 0
03.06.2014, 18:51:11
    #38660586
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
rows null
и
rows 47917900

ни о чем не говорят?
...
Рейтинг: 0 / 0
03.06.2014, 18:54:10
    #38660589
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
Код: sql
1.
SELECT max(mid_ind),mid as mid_ind FROM `boar_mxids` `t` WHERE mid=5;



ну и вот этот запрос кривой как бумеранг. в другой СУБД он бы вообще не выполнился, отвалился бы с ошибкой синтаксиса.
...
Рейтинг: 0 / 0
03.06.2014, 18:54:32
    #38660590
Pilsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
так а почему он начинает перебирать, если в select добавилось только поле mid?
в чем принципиальное отличие? оба поля есть в индексе ведь
...
Рейтинг: 0 / 0
03.06.2014, 18:57:30
    #38660593
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
Pilsenтак а почему он начинает перебирать, если в select добавилось только поле mid?
в чем принципиальное отличие? оба поля есть в индексе ведь
ага 47917900 раз
...
Рейтинг: 0 / 0
03.06.2014, 19:02:21
    #38660599
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
Pilsenтак а почему он начинает перебирать, если в select добавилось только поле mid?
в чем принципиальное отличие? оба поля есть в индексе ведьОтличие в том, что него кривая логика - в секции SELECT смесь из просто полей и агрегатных функций при отсутствии группировки. А оптимизатор не обязан хорошо справляться с кривыми запросами, он и с прямыми иногда ошибается.
...
Рейтинг: 0 / 0
03.06.2014, 19:07:46
    #38660611
Pilsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
miksoft, спасибо
...
Рейтинг: 0 / 0
03.06.2014, 19:17:10
    #38660628
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
Pilsen,

Кстати, а попробуйте так:
Код: sql
1.
SELECT max(mid_ind), max(mid) FROM `boar_mxids` `t` WHERE mid=5;
...
Рейтинг: 0 / 0
03.06.2014, 19:37:37
    #38660664
Pilsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
да, сработало. тоже "Select tables optimized away"

интересно!
...
Рейтинг: 0 / 0
04.06.2014, 12:24:49
    #38661218
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему select max(id),id на порядок дольше, чем select max(id) ?
создание правильного запроса - с приписыванием гроупбай ничего не меняет. всёравно мускл будет получать набор, и по нему проводить агрегацию.

а вот если только агрегирующие функции, он таки да, понимает что можно на индексном дереве получить результат.

ЗЫ
у меня таблица на 14млн записей. есть составной индекс. и отдельный.
все варианты приведёных сдесь запросов выполняються за 31-36мс (использовал игнор кеша)
таблица иннодб
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему select max(id),id на порядок дольше, чем select max(id) ? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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