Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Оптимизация запросов в MySQL - проблема (Александр) 29/11/2004 - 12:07:37
      Re: Оптимизация запросов в MySQL - проблема (Валентин) 29/11/2004 - 12:35:51
      Re: Оптимизация запросов в MySQL - проблема (Александр) 29/11/2004 - 12:51:19
      Re: Оптимизация запросов в MySQL - проблема (Валентин) 29/11/2004 - 12:59:13
      Re: Оптимизация запросов в MySQL - проблема (walrus) 29/11/2004 - 13:15:46
      Re: Разобрался! (Александр) 29/11/2004 - 15:37:29

> Original message text:
> From: Александр - 29/11/2004 - 12:07:37
> Subject:Оптимизация запросов в MySQL - проблема
> -----------------
> Скажем так: это система управления ссылками. На самом деле это не так, поэтому к абстрактности названий полей просьба не придираться :)
>
> CREATE TABLE mySQLTable
> (
> id MEDIUMINT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
>
> linkname CHAR(50) NOT NULL,
> link_att1 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 11,
> link_att2 TINYINT UNSIGNED NOT NULL DEFAULT 0,
>
> last_datecheck DATETIME NOT NULL,
> last_success_datecheck DATETIME NOT NULL,
> num_of_fail_checks SMALLINT NOT NULL DEFAULT 0,
> is_under_checking INT NOT NULL DEFAULT 0,
>
> INDEX (last_datecheck),
> INDEX (last_success_datecheck),
> INDEX (is_under_checking),
> UNIQUE (linkname),
> INDEX (link_att1),
> INDEX (link_att2)
> );
>
> Размер базы: 300 000 записей.
>
> Должны выполняться следующие запросы:
>
> Выбираем самую старую ссылку для того, чтобы ее проверить:
> Select * from mySQLTable WHERE ((is_under_checking=0) and (last_success_datecheck < '2004-10-01')) ORDER BY last_datecheck ASC LIMIT 1;
>
> выбираем самую старую ссылку, с доп. условиями:
> Select * from mySQLTable WHERE ((is_under_checking=0) and (link_att1=5) and (link_att2>15) and (last_datecheck <= '2004-11-20') and (last_success_datecheck < '2004-10-20')) ORDER BY last_datecheck ASC LIMIT 1;
>
> Select * from mySQLTable WHERE ((is_under_checking=0) and (last_success_datecheck BETWEEN '2003' and '2004')) ORDER BY last_datecheck ASC LIMIT 1;
>
> Вопрос:
> Какие нужно сделать индексы, чтобы эти запросы выполнялись быстро на базе в 300 000 записей?
> Пробовал EXPLAIN. Если в запросе либо только where, либо только order by - нет проблем. Если в where - константы (link_att1=5) + order by - тоже в общем-то не проблема.
> Но как только идет beetwen или >, < - ничего не получается, "filesort"
> База постоянно перепроверяется, в нее добавляются (и в ней обновляются) ссылки. Поэтому отсортировать один раз по last_datecheck не получится.
>
>


From: Валентин - 29/11/2004 - 12:35:51
Subject:Оптимизация запросов в MySQL - проблема
-----------------
Попробуй сделать такие индексы (делай на копии базы)
Оптимизация сводится в внесению в один индекс нескольких полей, которые используются в услових запросов. Поля индекса могут быть использованы только последовательно, т.е. если в индексе стоят поля 1,2,3,4 а в условии 2,3,1 - то индекс не может быть использован, нужно индекс 2,3,1 или 2 или 2,3 и т.д.

а) индекс по указанным полям
1)is_under_checking
2)last_datecheck
3)link_att1
4)link_att2

Если не может по дате в range входить, то попробовать на 1 и 2

б) второй по
1)is_under_checking
2)last_success_datecheck

вообще, если условия идут по одному ключу, а сортировка по другому, то избежать filesort сложно.
По индексам - покрути поля в индексе в различной последовательности, попробуй force - заставь делать так, как тебе удобнее, потому что mysql не всегда правильно выбирает индекс в 3.х - 4.0.х (но игнорировать мнение mysql не стоит, в 99,9% случаев по виду индкекс правильный либо по виду не совсем правильный, но самый быстрый на практике), в 4.1.х не тестировал на больших объемах данных.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
18750



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |