Mosik
Новичок
Оптимизация запросов
Задача такова:
Есть таблица с валютами. Есть таблица с курсами валют. Нужно получить Список валют с их текущими курсами.
Я написал два запроса, которые решают эту проблему. Но проанализировав результат explain по каждому я остался недоволен результатами. А как оптимизировать не знаю.
Вот структура и содержимое таблиц:
CREATE TABLE `pas_currencies` (
`id` tinyint(2) NOT NULL auto_increment,
`s_name` varchar(5) NOT NULL default '',
`name` varchar(25) NOT NULL default '',
`symbol_left` varchar(12) default NULL,
`symbol_right` varchar(12) default NULL,
`active` tinyint(1) NOT NULL default '0',
`date_added` datetime NOT NULL default '0000-00-00 00:00:00',
`last_modified` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idx_active` (`active`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6;
CREATE TABLE `pas_currencies_rates` (
`id` smallint(5) NOT NULL auto_increment,
`currencies_id` tinyint(2) NOT NULL default '0',
`rdate` date NOT NULL default '0000-00-00',
`rate` float NOT NULL default '0',
`frequency` float NOT NULL default '0',
`date_added` datetime NOT NULL default '0000-00-00 00:00:00',
`last_modified` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idx_currency` (`currencies_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=13;
Вот SQL-запросы:
1-й вариант:
SELECT cur.s_name, cur.active, rates.rate, rates.frequency
FROM pas_currencies as cur
LEFT JOIN (
SELECT currencies_id, MAX(rdate) max_rdate
FROM pas_currencies_rates
WHERE rdate <= '2005-08-15'
GROUP BY currencies_id
) rates1
ON cur.id=rates1.currencies_id
LEFT JOIN pas_currencies_rates rates
ON rates.currencies_id=cur.id AND rates.rdate=rates1.max_rdate
WHERE cur.active=1
2-й вариант:
SELECT cur.s_name, cur.active, rates.rate, rates.frequency
FROM pas_currencies as cur
LEFT JOIN (
SELECT *
from pas_currencies_rates
where rdate <= '2005-08-15'
order by rdate desc
) as rates
ON rates.currencies_id=cur.id
WHERE cur.active=1
GROUP BY cur.id
В моей БД встречаются аналогичные варианты но с более крупными таблицами и там начинаются тормоза.
Если кто может, помогите с оптимизацией.
Задача такова:
Есть таблица с валютами. Есть таблица с курсами валют. Нужно получить Список валют с их текущими курсами.
Я написал два запроса, которые решают эту проблему. Но проанализировав результат explain по каждому я остался недоволен результатами. А как оптимизировать не знаю.
Вот структура и содержимое таблиц:
CREATE TABLE `pas_currencies` (
`id` tinyint(2) NOT NULL auto_increment,
`s_name` varchar(5) NOT NULL default '',
`name` varchar(25) NOT NULL default '',
`symbol_left` varchar(12) default NULL,
`symbol_right` varchar(12) default NULL,
`active` tinyint(1) NOT NULL default '0',
`date_added` datetime NOT NULL default '0000-00-00 00:00:00',
`last_modified` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idx_active` (`active`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6;
CREATE TABLE `pas_currencies_rates` (
`id` smallint(5) NOT NULL auto_increment,
`currencies_id` tinyint(2) NOT NULL default '0',
`rdate` date NOT NULL default '0000-00-00',
`rate` float NOT NULL default '0',
`frequency` float NOT NULL default '0',
`date_added` datetime NOT NULL default '0000-00-00 00:00:00',
`last_modified` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idx_currency` (`currencies_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=13;
Вот SQL-запросы:
1-й вариант:
SELECT cur.s_name, cur.active, rates.rate, rates.frequency
FROM pas_currencies as cur
LEFT JOIN (
SELECT currencies_id, MAX(rdate) max_rdate
FROM pas_currencies_rates
WHERE rdate <= '2005-08-15'
GROUP BY currencies_id
) rates1
ON cur.id=rates1.currencies_id
LEFT JOIN pas_currencies_rates rates
ON rates.currencies_id=cur.id AND rates.rdate=rates1.max_rdate
WHERE cur.active=1
2-й вариант:
SELECT cur.s_name, cur.active, rates.rate, rates.frequency
FROM pas_currencies as cur
LEFT JOIN (
SELECT *
from pas_currencies_rates
where rdate <= '2005-08-15'
order by rdate desc
) as rates
ON rates.currencies_id=cur.id
WHERE cur.active=1
GROUP BY cur.id
В моей БД встречаются аналогичные варианты но с более крупными таблицами и там начинаются тормоза.
Если кто может, помогите с оптимизацией.