ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Mikhail Yakshin <greycat@altlinux.org>
To: ALT Linux Team development discussions <devel@lists.altlinux.org>
Subject: Re: [devel] Mysqld CPU usage at www.sisyphus.ru
Date: Wed, 2 Sep 2009 01:47:33 +0400
Message-ID: <240e377b0909011447y6665b8d3m654790f0c91d35@mail.gmail.com> (raw)
In-Reply-To: <20090901232053.02980844@bga>

>> > SELECT DISTINCT s.name, s.version, s.rel, m.packager, s.summary, s.repo
>> > FROM srpm as s, maintainers as m, rpm as r WHERE  r.srpm = s.name AND
>> > m.mail=s.packager AND ( s.name RLIKE 'unichrome'  OR  s.summary RLIKE
>> > 'unichrome'  OR  s.description RLIKE 'unichrome'  OR  r.namen RLIKE
>> > 'unichrome' ) AND s.repo='Sisyphus' AND r.repo='Sisyphus' ORDER BY 1
>> > ASC LIMIT 0,20;
>> >
>> > Может быть, заменить RLIKE на MATCH AGAINST ? Будет быстрее?
>>
>> Во-первых, проверить индексы, по которым производится JOIN. Имеет
>> смысл выписать это в явный "INNER JOIN ON что-то":
>>
>> > WHERE  r.srpm = s.name AND m.mail=s.packager
>>
>> Во-вторых, такой RLIKE скорее всего вообще не использует индексы и
>> запрос превращается в FULL SCAN. Проверить индексы, по которым
>> делается RLIKE и заменить его либо на LIKE 'запрос%', либо на
>> равенство.
>>
>> MATCH AGAINST потребует полнотекстовых индексов, да и будет возвращать
>> совсем не то, что хочется, как я понял.
>
> Индексов на summary, description сейчас вообще нет.
>
> RLIKE используется для поиска любого совпадения в name, summary,
> description. 'запрос%' сработает только на совпадение в начале
> строки.

Подавляющее большинство SQL-реализаций (включая MySQL) не умеет
использовать для поисковых запросов типа '%запрос%' (будь они сделаны
через такой LIKE, через RLIKE, через REGEXP или заданы каким-то иным
способом) индексы, т.е. такой запрос будет всегда приводить к FULL
SCAN.

Вообще задача быстрого поиска произвольной подстроки в некоем
количестве строк - весьма нетривиальна и универсального решения до сих
пор толком нет. Пожалуй, наиболее близко к нему продвинулись Google в
Code Search, но они, редиски, далеко не все свои наработки публикуют.

По сути, в современном SQL способов готовых не так много, все много -
все они в той или иной степени компромиссны:

1) Искать по полнотекстовым индексам => огребаем необходимость строить
и поддерживать эти индексы и всякие слабо совместимые с практической
задачей поиска пакетов по названием ограничения. Например, "libapr1"
по запросу "apr" в полнотекстовом индексе найти малореально. При
построении индексов "libapr1" будет разбито на 2лексемы "libapr" и
"1". Первая будет заиндексирована, вторая выкинута из-за маленькой
длины и, как следствие, высокой частотности. С другой стороны - для
summary этот способ применить может быть и можно.

2) Остановиться волевым решением на поиске по началу вхождения - LIKE
'запрос%'. Субъективно - мне кажется, для пакетов этого должно быть
вполне достаточно.

3) Жить с FULL SCANом, но перестроить запрос таким образом, чтобы FULL
SCAN производился по небольшому количеству записей - что-то типа
O(table1) + O(table2) + O(table3). Сейчас, возможно, запрос
производится по что-то типа O(table1)*O(table2)*O(table3) записей -
потому, что оптимизатор решает делать сначала FULL OUTER JOIN, а потом
уже отсекать из него нужное путем применения WHERE-фразы. Я уже описал
способы решения - что стоит для начала WHERE (условия join'а)
переписать в явные условия join'а. Если не поможет - тогда разделить
это на 3 отдельных запроса (просто вытаскивающие IDшники) + один
запрос, делающий SELECT * FROM table1 INNER JOIN table2 INNER JOIN
table3 WHERE id IN (вытащенные IDшники).

Если задача - "зафиксить побыстрее" - то вариант #3, как мне кажется,
упрется в минут пять работы и, скорее всего, даст результаты в виде
снижения 5-6 секунд до 200-300-400 мс. С моей точки зрения, впрочем,
200-300-400 мс - это непозволительно много для веб-приложения, но
YMMV.

-- 
WBR, Mikhail Yakshin

  parent reply	other threads:[~2009-09-01 21:47 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-01 13:08 Grigory Batalov
2009-09-01 13:10 ` Alexey I. Froloff
2009-09-01 13:11 ` Alex Gorbachenko
2009-09-01 13:32   ` Grigory Batalov
2009-09-01 13:40     ` Alex Gorbachenko
2009-09-01 14:49       ` Grigory Batalov
2009-09-01 15:03         ` Mikhail Yakshin
2009-09-01 19:20           ` Grigory Batalov
2009-09-01 19:21             ` Aleksey Avdeev
2009-09-01 20:27               ` Grigory Batalov
2009-09-01 21:47             ` Mikhail Yakshin [this message]
2009-09-02  1:16               ` Денис Смирнов
2009-09-02  4:35                 ` Mikhail Yakshin
2009-09-01 13:12 ` Michael Shigorin
2009-09-01 16:36 ` Vitaly Lipatov
2009-09-01 20:49 ` Денис Смирнов

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=240e377b0909011447y6665b8d3m654790f0c91d35@mail.gmail.com \
    --to=greycat@altlinux.org \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git