[devel] Mysqld CPU usage at www.sisyphus.ru

Grigory Batalov bga at altlinux.org
Tue Sep 1 22:20:53 UTC 2009


On Tue, 1 Sep 2009 19:03:00 +0400
Mikhail Yakshin wrote:

> > 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. 'запрос%' сработает только на совпадение в начале
строки.


More information about the Devel mailing list