Вполне новый для запросов MySQL, помимо простых вставок и отборов, поэтому, если это кажется совершенно базовым, я заранее извиняюсь.
У меня есть база данных с несколькими отношениями «многие ко многим», и я пытаюсь построить запрос JOIN для 3 таблиц. Это первый большой / большой запрос, который я попытался написать, поэтому я буду следовать тому, какие уроки я прочитал. Запрос возвращает все правильные значения, однако кажется, что он выполняется довольно медленно (в среднем 0,25 секунды, но достигает пика около 0,7 на локальном хосте).
Мне интересно, есть ли у кого-нибудь совет, как сделать его более эффективным? Я поиграл с индексами (также новыми для них), и это, кажется, имеет мало измеримый эффект - убийцей в реальном времени здесь, по-видимому, являются операторы ORDER BY. К сожалению, я не могу придумать, как оптимизировать их, несмотря на траление переполнения стека и пробовать множество вещей.
Этот вопрос касается:
SELECT a.d_id, cs_id, blg_id, d_name, d_slug, ct_id, a.cc_id
FROM collection a
JOIN designers b
ON a.d_id = b.d_id
JOIN designer2type c
ON a.cc_id = c.cc_id
WHERE cs_id = '3'
ORDER BY d_name, ct_id ASC
Я попробовал несколько альтернатив (скопировал несколько учебных пособий по подзапросам, выполнение которых занимало гораздо больше времени, а также следующие, которые имеют аналогичное среднее, но гораздо более высокое значение:
SELECT collection.d_id, cs_id, blg_id, d_name, d_slug, collection.cc_id, c_url FROM collection, designers, c_image WHERE cs_id = '3' AND c_image.ci_id = collection.ci_id AND collection.d_id = designers.d_id ORDER BY d_name ASC
Это объяснение с || представляющие разрывы столбцов:
id || select_type || table || type || possible_keys || key || key_len || ref || rows || Extra
1 || SIMPLE || a || ref || PRIMARY,d_id,cs_id || cs_id || 4 || const || 8403 || Using temporary; Using filesort
1 || SIMPLE || b || eq_ref || PRIMARY || PRIMARY || 4 || test.a.d_id || 1
1 || SIMPLE || c || ref || cc_id || cc_id || 4 || test.a.cc_id || 1
А это структуры таблиц:
CREATE TABLE `collection` (
`cc_id` int(8) NOT NULL AUTO_INCREMENT,
`d_id` int(4) NOT NULL,
`cs_id` int(3) NOT NULL,
`cfw_id` int(2) NOT NULL,
`c_id` int(8) NOT NULL,
`ci_id` int(8) NOT NULL,
`cg_id` int(1) NOT NULL,
`blg_id` bigint(20) NOT NULL,
PRIMARY KEY (`cc_id`),
KEY `d_id` (`d_id`),
KEY `cs_id` (`cs_id`),
KEY `cfw_id` (`cfw_id`),
KEY `c_id` (`c_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `designers` (
`d_id` int(4) NOT NULL AUTO_INCREMENT,
`d_name` varchar(100) NOT NULL,
`d_slug` varchar(100) NOT NULL,
PRIMARY KEY (`d_id`),
KEY `d_name` (`d_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=52782 ;
CREATE TABLE `c_designer2type` (
`cd2t_id` int(8) NOT NULL AUTO_INCREMENT,
`cc_id` int(8) NOT NULL,
`ct_id` int(2) NOT NULL,
`cd2t_desc` text NOT NULL,
PRIMARY KEY (`cd2t_id`),
KEY `cc_id` (`cc_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=57545 ;
Я не уверен, является ли это проблемой запроса, проблемой индекса или структурой таблицы. Или, возможно, не проблема вообще, хотя на локальном узле макс. Около секунды без какой-либо другой нагрузки и только среднее количество строк кажется высоким в моей голове. В любом случае, ничто в этом проекте не используется, поэтому при необходимости все можно изменить.
Если у кого-нибудь есть какие-либо мысли / советы о том, где я могу пойти не так в квесте, он будет очень признателен :) 10 *
Спасибо, Таня