Помогите построить более "быстрый" запрос.

icuken

Guest
Помогите построить более "быстрый" запрос.

В чем суть...
Существуют две таблицы:
Код:
Table1:
Field	Type	Null	Key	Default	Extra
A	int(11)	YES	MUL	NULL	
B	int(11)	YES	MUL	NULL	
C	int(11)	YES	MUL	NULL
Код:
Table2:
Field	Type	Null	Key	Default	Extra
D	int(11)		PRI	0
Таблица Table2 заполняется PHP-скриптом и содержит неповторяемые значения.
Количество записей в Table1 — 23 миллиона, в Table2 - 230 тысяч (будет увеличиваться).

Задача: неоходимо выбрать все записи из Table1, где Table1.B=Table2.D.
На что был составлен запрос:
Код:
SELECT t1.A, t1.C FROM `Table1` as t1, `Table2` as t2 WHERE t1.B=t2.D
Но этот запрос выполняется около сорока минут.

Вопрос в следующем: можно ли как-то увеличить производительность этого запроса?
Или построить другой запрос, который укладывался бы в 10 минут.
 

Фанат

oncle terrible
Команда форума
я думаю, тут надо уже не запрос оптимизировать, а сервер БД
в частности, хватает ли ему памяти под индекс?
 

vovik

Новичок
Предлагаю проверить такие варианты, какая будет скорость ?

1. Без индекса по B
2. С индексом (B, A, C)

Сам запрос исправлять уже наверное некуда, слишком все просто. Хотя вызывает некоторое недоумение необходимость вытаскивать из БД 230 тысяч записей.
 

icuken

Guest
Индекс по A,B,C занимает 611МБ... (это одной таблицы)
Памяти, есс-но, не особенно то и хватает...

А 230 тысяч записей действительно необходимо вытаскивать :)
 

vovik

Новичок
Ну так индекс по A,B,C еще и не будет работать при этом запросе. Или он для других запросов ?

Добавьте памяти. Скорее всего, это обойдется дешевле, чем оплата времени программистов, которые несколько дней будут супер оптимизировать.
 

icuken

Guest
Сейчас:
индекс по A,
индекс по B,
индекс по C...

-~{}~ 21.08.06 16:26:

Потому как с Table1 возможны взаимодействия:
Выбрать A и C по B или выбрать B по A и C.
 

Апельсин

Оранжевое создание
icuken, т.е. сейчас у таблицы 3 индекса каждый из которых покрывает только один столбец?

Вообще делать такие джоины без каких-либо ограничений - это зло.
 

vovik

Новичок
Автор оригинала: icuken
Сейчас:
индекс по A,
индекс по B,
индекс по C...

-~{}~ 21.08.06 16:26:

Потому как с Table1 возможны взаимодействия:
Выбрать A и C по B или выбрать B по A и C.
Думаю, что при этом или индекс по A или по С никогда не используется :) Треть от 611 мб выкинуто впустую :)

Еще раз предлагаю проверить скорость запроса при наличии одного индекса по полям (B,A,C).
 

icuken

Guest
Сейчас попробую.

-~{}~ 21.08.06 18:23:

С индексом только по полю B получилось примерно в полтора раза быстрее... Уже результат.
Может быть что-то еще возможно сделать?

-~{}~ 21.08.06 18:34:

Еще лучше помогла перемена таблиц в запросе местами, то есть:
SELECT t1.A, t1.C FROM `Table2` as t2, `Table1` as t1 WHERE t1.B=t2.D
--------------------------------------
Итог:
1. порубил индексы.
2. поменял последовательность таблиц в запросе.
Время выполнения скажу чуть позже...

-~{}~ 21.08.06 18:38:

Итоговый результат: 3 минуты.
 

Navarro

Новичок
Интересно, что можно напихать чтобы получилось 23 миллиона записей?
 

Апельсин

Оранжевое создание
Navarro, ничего удивительного в этом нет.

А вот то что человек делает джоины без каких либо ограничений и выбирает все строки, говорит о том что у него либо база спроектирована неправильно, либо приложение, либо руки кривые.
 
Сверху