Помогите правильно расставить индекс(ы)

Max_kmv

Новичок
Помогите правильно расставить индекс(ы)

Всем привет!

Есть таблица из четырех полей описывающих связи между двух объектов.разных типов.

prnt_type (int), prnt_id(int), chld_type (int), chld_id (int).

Чаще всего, необходимо найти и построить ветвь по определенному родителю/ребенку либо ближайшие связи по определенным типам (колонки *_type). Т.е. чаще всего, ищутся строки по известным
WHERE prnt_type=? && prnt_id = ?
или
WHERE prnt_type =? && prnt_id = ? && chld_type = ?.

Сделал четыре отдельных индекса по каждому полю. Чувствую, что это не самое эффективное. Подскажите пожалуйста, как можно лучше поставить индексы? Какой ставить PRIMARY?
 

ForJest

- свежая кровь
Читай последовательно - это недолго. И по-русски.

http://detail.phpclub.ru/article/mysql_optimize
http://dev.mysql.com/doc/mysql/ru/query-speed.html
http://dev.mysql.com/doc/mysql/ru/optimising-database-structure.html

-~{}~ 15.06.05 10:42:

Если после прочтения будут вопросы - можно их тогда уже обсудить. Пока что я вижу, что недостаточно знаний, для того чтобы оказать эффективную помощь.
 

Falc

Новичок
Max_kmv
Есть подозрение что индекс:
INDEX(prnt_type, prnt_id, chld_type, chld_id)
Будет очень эфективным в данном случае. Возможно его и можно сделать PRIMARY, для этого надо подробнее знать природу данных.
 

Max_kmv

Новичок
Да, почитал вот ссылки, даные выше, и собсно тоже пришел к составному индексу. Но, немного в другому виде, не сразу по четрым полям. Поскольку наиболее распространены запросы когда известны оба типа и один из id (родителя или ребенка) и надо найти соответствующие пары, то индекс INDEX (prnt_type, prnt_id, chld_type, chld_id) будет работать только когда идет поиск id ребенка при известных prnt_type, prnt_id и chld_type. Но при обратной, когда надой найти id родителя, работать не будет. Потому, решил сделать 2 составных индекса:

INDEX(prnt_type, prnt_id, chld_type) для поиска детей (chld_id)
и
INDEX(chld_type, chld_id, prnt_type) для поиска родителей (prnt_id)
 

Falc

Новичок
Max_kmv
Что-то у тебя наиболее распространенные запросы меняются. Индекс из 4-х полей я тебе предложил для того что бы мускул вообще к данным не обращался. Для того чтобы корректно раставить индексы необходимо знать как распределены данные и какие запросы идут к ним.
А индекс из 4-х полей я все-таки рекомендую оставить. Причем сделать его таким что бы максимальное количество запросов именно его использовало.
 

Max_kmv

Новичок
К сожалению, предлагаемый тобою индекс не будет использоваться при условии
WHERE chld_type = ? && chld_id = ? && prnt_type =?
а это и есть условие поиска родителей, при известном ребенке

но выгоду, что бы данные выбирались не обращаясь в файл данных я понял.

-~{}~ 16.06.05 12:42:

теоретически, можно было бы тогда и второй индекс по четырем полям, но уже в обратном порядке. Если не найду других аргументов "против" кроме как увеличения размера индексов (замедление при вставке и апдейте некритичны.), то наверное так и сделаю
спасибо за помощь
 

Falc

Новичок
Max_kmv
Если у тебя родители ищутся не очень часто то возможно для их поиска хватит простого индекса по chld_id.
 
Сверху