Индексы имеют огромное значение в mysql, один запрос, который занимал 15 минут с неправильным набором индексов, занимал .2 секунды с правильными, но обычно находил правильный баланс, что является проблемой. Естественно, без каких-либо примеров данных трудно сказать, сэкономит ли приведенное ниже решение какое-либо время, но теоретически это должно быть.
Чтобы ответить на ваши вопросы, я бы изменил таблицы следующим образом:
CREATE TABLE `product_all` (
`prod_id` INT( 10 ) NOT NULL,
`ref_id` INT( 10) NOT NULL,
`date` DATE NOT NULL ,
`buy_link` BLOB NOT NULL ,
`sale_price` FLOAT NOT NULL,
PRIMARY KEY (prod_id, ref_id) ,
INDEX date_Index (`date` ASC),
UNIQUE INDEX prod_price_Index (prod_id ASC, sale_price ASC)
) ENGINE = MYISAM ;
CREATE TABLE `product_info` (
`prod_id` INT( 10 ) NOT NULL AUTO_INCREMENT,
`prod_name` VARCHAR( 200 ) NOT NULL,
`brand` VARCHAR( 50 ) NOT NULL,
`retail_price` FLOAT NOT NULL,
`category` INT( 3 ) NOT NULL,
`gender` VARCHAR( 1 ) NOT NULL,
`type` VARCHAR( 10 ) NOT NULL,
PRIMARY KEY (prod_id) ,
UNIQUE INDEX prod_id_name_Index (prod_id ASC, prod_name ASC),
INDEX category_Index (category ASC),
INDEX gender_Index (gender ASC)
) ENGINE = MYISAM ;
SELECT product_info.*, MIN(product_all.sale_price) as sale_price, product_all.buy_link
FROM product_info
NATURAL JOIN (SELECT * FROM product_all WHERE product_all.date = '2010-09-30') as product_all
WHERE (product_info.category = 2
AND product_info.gender = 'W' )
GROUP BY product_all.prod_id
ORDER BY MIN(product_all.sale_price) ASC LIMIT 13
Прирост производительности здесь достигается за счет индексации основных полей, к которым присоединяются и которые указаны в предложении where. Лично я бы пошел с вашим первым запросом, когда вы думаете об этом, который должен работать лучше.
Насколько я понимаю, что происходит в первом и втором запросе:
- Первый запрос фильтруется
подзапрос до выполнения
естественное соединение, это означает, что его единственное
присоединение к полученным данным, а не
весь стол.
- Второй запрос присоединяется к
весь второй стол, а затем
фильтрация результирующих строк
вернемся к тому, что вы хотите.
Как правило, вы хотите добавить индексы к основным полям соединения, а также к полям, которые вы чаще всего используете в предложениях where. Я также поместил некоторые уникальные индексы в некоторые поля, которые вы хотите регулярно запрашивать, например, prod_id_name_Index.
Если это не улучшит вашу производительность, возможно, вы сможете опубликовать несколько фиктивных данных, чтобы поиграть с ними, я смогу получить более быстрое решение, которое я смогу сравнить.
Здесь - статья, посвященная индексации производительности в mysql, которую стоит прочитать, если вы хотите узнать больше.
Удачи!
РЕДАКТИРОВАТЬ: Ваш последний вопрос, который я пропустил в первый раз, ответ таков: если индексация основных объединяющих полей приведет к изменению местоположения, оно лишь незначительно повлияет на общую производительность, но уникальные индексы, которые я поместил в таблицы, должны учитывать большинство вещей, на которые вы хотите основывать запросы. Главное, что нужно помнить, если вы часто запрашиваете или присоединяетесь к полю, тогда оно действительно должно быть проиндексировано, но о незначительных запросах и изменениях в вашем заказе просто не стоит беспокоиться о перестройке вашей стратегии индексирования.