shoorick: (Default)
[personal profile] shoorick
Странности творятся. Почитав мануал, обращаюсь к друпаловой БД, ищу дубликаты адресов в таблице с 7500 строками:
SELECT `alias`
FROM `PREFIX_url_alias`
GROUP BY `language`, `alias`
HAVING COUNT(*)>1;
MySQL достаточно резво выдаёт ответ из почти семи десятков строк. Делаю запрос с подзапросом, чтоб выбрать номера узлов с найденными на предыдущем шаге дублями:
SELECT `source`
FROM `PREFIX_url_alias`
WHERE `alias` IN (
    SELECT `alias`
    FROM `PREFIX_url_alias`
    GROUP BY `language`, `alias`
    HAVING COUNT(*)>1
);
В итоге MySQL тяжко задумывается — вот уж 20 минут непонятно, что делает. Посмотрел SHOW CREATE TABLE — по полю `alias` строится индекс. Чё ему ещё надо-то?

P. S. Понятно, что я могу найденное на первом шаге тупо перебрать в цикле, написав какой-нибудь перлоскрипт, однако хочется сделать как-то изящнее.

Date: 2012-02-13 02:28 pm (UTC)
From: [identity profile] slach.livejournal.com
если версия mysql ниже чем 5.5
то оно априори на подзапросах тормозить будет

EXPLAIN погляди ... можешь удивиться

Date: 2012-02-13 03:32 pm (UTC)
From: [identity profile] anspa.livejournal.com
а что случилось в версии 5.5? Болгарский кандидат наук наконец-то написал обещанную оптимизацию перекрестных запросов?

Date: 2012-02-14 05:11 am (UTC)
From: [identity profile] slach.livejournal.com
нет что вы... ничего не случилось =) продолжайте дальше исходить слюной =)
Монти и Петя Зайвцев, по совету Момджана
начали приносить лобковые скальпы под портрет Ларри Эллисона и Стива (не джобс) Болмера ;-))

Date: 2012-02-14 05:26 am (UTC)
From: [identity profile] anspa.livejournal.com
кхм, совет не по адресу.

Date: 2012-02-15 11:20 am (UTC)
From: [identity profile] slach.livejournal.com
прошу прощения, просто неверно воспринял эмоциональную окраску!

Date: 2012-02-15 03:12 pm (UTC)
From: [identity profile] anspa.livejournal.com
ок, принято! просто я был Oracle dba с 15-летним стажем. и уже несколько лет использую MySQL для всей своей работы с данными, а оракл как раз забросил. =)

Date: 2012-02-13 04:13 pm (UTC)
From: [identity profile] shoorick.livejournal.com
Ниже. Там 5.0.smth

Поглядел EXPLAIN, поменял местами поля в GROUP BY, поглядел ещё раз (стало лучше), но всё равно неидеально: похоже, он только в подзапросе использует индекс, а в основном запросе — нет:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1PRIMARYn_url_aliasALLNULLNULLNULLNULL7419Using where
2DEPENDENT SUBQUERYn_url_aliasindexNULLalias_language_pid809NULL7419Using index

Date: 2012-02-14 05:12 am (UTC)
From: [identity profile] slach.livejournal.com
ну... у тебя 7419 * 7419 записей...
поэтому 20 минут =)

в общем все плохо

Date: 2012-02-13 03:32 pm (UTC)
From: [identity profile] anspa.livejournal.com
mysql известно тормозит на перекрестных запросах (по экспоненте с ростом количества записей в исходных таблицах).

можно сделать temp table, выбрав туда ключи дубликатов. и уже из той таблицы попробовать сделать alias in (select ...

в обеих таблицах (временной и исходной) ключевое поле (alias) должны быть проиндексированы.

Date: 2012-02-14 05:13 am (UTC)
From: [identity profile] slach.livejournal.com
вот это кстати дельный совет, реально =)

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 17th, 2025 11:36 pm
Powered by Dreamwidth Studios