powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Очень долго выполняется запрос
10 сообщений из 10, страница 1 из 1
Очень долго выполняется запрос
    #32718403
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица base1.table1
в таблице около 200 000 записей

Key1 - ключевое поле INTEGER AUTOINCREMENT
Key2 - INTEGER подстановка из другой таблицы много повторяющихся значений
Number - VARCHAR произвольные повторяющиеся значения в том числе и имеющие значение '0'

Index1 - Key1
Index2 - Key2
Index3 - Number
------------------------
Key1 | Key2 | Number |
------------------------
1 | 2 | 1a5b |
2 | 4 | 89er |
... ... ...
189456| 2 | 0 |

Нужно выбрать значения Key2 где Number = '0' но только те значения, где количество всех значений в поле Number больше 1 (вместе с нулевыми значениями). Например Key2 = 2 имеет значение Number = '1a5b' и '0' и поэтому подпадает под критерий.

SELECT t.Key2, Count(t.Key1)
FROM base1.table1 t
WHERE t.Key2 IN (SELECT Key2 FROM base1.table1 t
WHERE t.Number = '0')
GROUP BY t.Key2
HAVING Count(t.Key1) > 1

Сервер Linux Fedora Core 2 mysql-5.0.2-alpha-nightly-20040926

Проц на линухе загружен на 100% процессом mysqld. Запрос выполняется за 15 минут.

Простые запросы выполняет быстро.

Где грабель???
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32718490
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грабель, очевидно, в индексе на варчар.
У меня (правда - на третьем мускуле) - тоже была похожая трабла - пришлось варчары переделать в чары - тогда индекс нормально стал работать.
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32719057
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажи explain
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32719567
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустил EXPLAIN. Он показал, что основной запрос не использует индексы. Применил команду FORCE INDEX. Время выполнения запроса упало с 15 минут до 3 минут. Но это всё равно много.

Куда можно ещё копнуть?
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32719905
А такой запрос разве не тоже самое делает?

Код: plaintext
1.
2.
3.
4.
SELECT t.Key2, Count(t.Key1) cnt
FROM base1.table1 t
WHERE t.Number = '0'
GROUP BY t.Key2
HAVING cnt >  1 

Тогда попробуй создать ключик

Код: plaintext
ALTER TABLE base1.table1 ADD INDEX g(Number, Key2)
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32720213
ApeЗапустил EXPLAIN. Он показал, что основной запрос не использует индексы. Применил команду FORCE INDEX. Время выполнения запроса упало с 15 минут до 3 минут. Но это всё равно много.

Куда можно ещё копнуть?

PII 350, 128M; W2K Pro SP4; MySQL 5.0.0a
2 мин 50 сек без форсов

Тока я бы сделал так:

Код: plaintext
1.
2.
3.
4.
SELECT t1.Key2, count(t1.key1)
FROM table1 t1, table1 t2
WHERE t2.Number = '0' AND t1.key2=t2.key2
GROUP BY t1.key2
HAVING count(t1.key1)> 1 

Результат: 1.59 сек!
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32720275
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег Олегович

Тока я бы сделал так:

Код: plaintext
1.
2.
3.
4.
SELECT t1.Key2, count(t1.key1)
FROM table1 t1, table1 t2
WHERE t2.Number = '0' AND t1.key2=t2.key2
GROUP BY t1.key2
HAVING count(t1.key1)> 1 

Результат: 1.59 сек!

Интересное решение. Надо попробовать...
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32720294
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Получилось!!!
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32720422
ApeСпасибо! Получилось!!!

Кажись, " перему дриваем":)
Как уже справедливо заметил Александр Прокопюк , похоже, запрос

Код: plaintext
1.
2.
3.
4.
SELECT t.Key2, Count(t.Key1) cnt
FROM base1.table1 t
WHERE t.Number = '0'
GROUP BY t.Key2
HAVING cnt >  1 

делает то же самое.
...
Рейтинг: 0 / 0
Очень долго выполняется запрос
    #32721009
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег Олегович
Кажись, " перему дриваем":)
Как уже справедливо заметил Александр Прокопюк , похоже, запрос

Код: plaintext
1.
2.
3.
4.
SELECT t.Key2, Count(t.Key1) cnt
FROM base1.table1 t
WHERE t.Number = '0'
GROUP BY t.Key2
HAVING cnt >  1 

делает то же самое.

Этот запрос ничего не возвращает. А должно быть 6864 записи.
И этот запрос не может ничего выдать, потому как значений Key2 имеющих количество значений Number = '0' болше одного просто не существует.
Короче говоря этот запрос находится за рамками условия задачи. А вот запрос с логическим отображением таблицы и связыванием - работает. Красивое решение. Выполняется на моей технике мгновенно.

И всётаки в пятом мускуле остались грабли с операторами
Код: plaintext
 IN и NOT IN 
(и не удивительно - всётаки альфа). В любом случае не должен запрос так долго выполняться. Как я понимаю механизм исполнения вложенных запросов, сначала производится выборка по внутреннему селекту с созданием временной таблицы и связыванием по условию
Код: plaintext
 WHERE ... IN ... 
. Это практически то же отображение и связывание, только по уже отобранным данным, а значит и работать должно быстрее.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Очень долго выполняется запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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