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

  • Автор темы Автор темы icuken
  • Дата начала Дата начала

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 минут.
 
я думаю, тут надо уже не запрос оптимизировать, а сервер БД
в частности, хватает ли ему памяти под индекс?
 
Предлагаю проверить такие варианты, какая будет скорость ?

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

Сам запрос исправлять уже наверное некуда, слишком все просто. Хотя вызывает некоторое недоумение необходимость вытаскивать из БД 230 тысяч записей.
 
Индекс по A,B,C занимает 611МБ... (это одной таблицы)
Памяти, есс-но, не особенно то и хватает...

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

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

-~{}~ 21.08.06 16:26:

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

Вообще делать такие джоины без каких-либо ограничений - это зло.
 
Автор оригинала: icuken
Сейчас:
индекс по A,
индекс по B,
индекс по C...

-~{}~ 21.08.06 16:26:

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

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

-~{}~ 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 минуты.
 
Интересно, что можно напихать чтобы получилось 23 миллиона записей?
 
Navarro, ничего удивительного в этом нет.

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