powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Зависает селект
5 сообщений из 5, страница 1 из 1
Зависает селект
    #39021041
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
mysql> explain select data1 from template_rupostdata where pid in (select id from rupostdata where map=568);
+----+--------------------+---------------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type        | table               | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+--------------------+---------------------+------+---------------+------+---------+------+-------+-------------+
|  1 | PRIMARY            | template_rupostdata | ALL  | NULL          | NULL | NULL    | NULL | 13779 | Using where |
|  2 | DEPENDENT SUBQUERY | rupostdata          | ALL  | NULL          | NULL | NULL    | NULL | 66761 | Using where |
+----+--------------------+---------------------+------+---------------+------+---------+------+-------+-------------+
2 rows in set

mysql> explain select data1 from template_rupostdata where pid in (select * from (select id from rupostdata where map=568) as a);
+----+--------------------+---------------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type        | table               | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+--------------------+---------------------+------+---------------+------+---------+------+-------+-------------+
|  1 | PRIMARY            | template_rupostdata | ALL  | NULL          | NULL | NULL    | NULL | 13779 | Using where |
|  2 | DEPENDENT SUBQUERY | <derived3>          | ALL  | NULL          | NULL | NULL    | NULL |    28 | Using where |
|  3 | DERIVED            | rupostdata          | ALL  | NULL          | NULL | NULL    | NULL | 66761 | Using where |
+----+--------------------+---------------------+------+---------------+------+---------+------+-------+-------------+
3 rows in set



Первый селект зависает, вися в процесслисте с "Sending data". Второй выполняется нормально, быстро. Знаю, что лучше использовать джойн, он и выполняется нормально, но иногда приходится пользоваться in ().
Скажите, пожалуйста, почему первый селект зависает?

Мой конфиг:
Код: powershell
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.
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=1871
basedir=/usr
datadir	= /var/lib/mysql
tmpdir=/tmp
#bind-address=127.0.0.1
skip-external-locking
#skip-locking
skip-name-resolve
skip-show-database

init_connect=‘SET collation_connection = utf8_unicode_ci’
character-set-server = utf8
collation-server = utf8_unicode_ci

connect_timeout=10
max_connections=200
max_allowed_packet=128M
thread_cache_size= 8
thread_stack=512K
open_files_limit=20000

table_open_cache=8192
table_definition_cache=8192
wait_timeout=10800
net_read_timeout=60
net_write_timeout=60
tmp_table_size=12M

query_cache_size=64M
query_cache_limit=1M

key_buffer_size=200M
join_buffer_size=8M
sort_buffer_size=1M
read_buffer_size=64K
read_rnd_buffer_size=128K
bulk_insert_buffer_size=64K

slow_query_log_file	= /var/log/mysql/slow.log
log-queries-not-using-indexes=1
slow-query-log=0
log-error=/var/log/mysql/error.log
long_query_time=2
expire_logs_days=10

#skip-bdb
skip-federated
#ignore_builtin_innodb
default_storage_engine=InnoDB

innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_buffer_pool_size=11000M
innodb_additional_mem_pool_size=20M
innodb_file_per_table=1
innodb_file_format=Barracuda

innodb_log_file_size=1024M
#innodb_use_sys_malloc=0

innodb_thread_concurrency=4
#innodb_locks_unsafe_for_binlog=1
#innodb_force_recovery=4

...
Рейтинг: 0 / 0
Зависает селект
    #39021065
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey10Второй выполняется нормально, быстро.Забавный workaround, я такого еще не встречал :)
И даже логичный.
andrey10Скажите, пожалуйста, почему первый селект зависает?Он не зависает, а просто долго выполняется.
Это срабатывает баг конструкции IN (SELECT ...), из-за которого оптимизатор не понимает, что подзапрос независимый (это видно по слову DEPENDENT в плане) и выполняет каждый раз, когда нужно проверить условие IN, т.е. для каждой записи таблицы template_rupostdata.
А второй запрос работает быстрее, насколько я могу предположить, поскольку оборачивание в дополнительный подзапрос материализует результат подзапроса в виде небольшой таблички, на которой проверка IN выполняется быстрее, чем на оригинальной таблице. А это происходит потому что на ней нет индекса по полю map. Если его создать, то, подозреваю, оба запроса будут работать одинаково или почти одинаково быстро, и быстрее, чем сейчас.
...
Рейтинг: 0 / 0
Зависает селект
    #39021177
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое!
...
Рейтинг: 0 / 0
Зависает селект
    #39021380
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, а ничего, что там у него индексов нет от слова совсем?
...
Рейтинг: 0 / 0
Зависает селект
    #39021489
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, так тем более! Прошерстить 13779*66761 записей или 13779*28 - разница весьма существенная.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Зависает селект
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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