У меня есть представление, определенное следующим образом:Как оптимизировать производительность MySQL зрения
CREATE VIEW vw_data_summary AS
SELECT
a.b_id AS b_id
b.txt_field AS b_txt_field
a.txt_field AS a_txt_field
SUM(a.amount) AS amount
FROM
a JOIN b
WHERE
a.b_id = b.id
GROUP BY
a.b_id, b.txt_field, a.txt_field
Таблица a
имеет 650000 записей, в то время как таблица b
имеет 3200 записей. Есть индекс на a.b_id
. Таблицы растут со скоростью 1500 записей в день на таблице a и 50 записей в день на таблице b.
Когда я запускаю выбор в представлении, это занимает около 25 секунд. Я обеспокоен тем, что по мере того, как таблицы будут расти в размерах, производительность этого запроса будет быстро ухудшаться.
Что я могу сделать, как для отдельных таблиц, так и для самого представления, для повышения производительности?
EXPLAIN
Запуск explain
на выбор выше дает следующий вывод:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b ALL PRIMARY NULL NULL NULL 3078 Using temporary; Using filesort
1 SIMPLE a ref b_id b_id 4 b.id 134
ТАБЛИЦА ОПРЕДЕЛЕНИЯ
CREATE TABLE IF NOT EXISTS `b` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`txt_field` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `txt_field` (`txt_field`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`b_id` int(11) NOT NULL,
`txt_field` varchar(255) NOT NULL,
`amount` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `txt_field` (`txt_field`),
KEY `b_id` (`b_id`),
KEY `new_index` (`txt_field`,`b_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Неправильно ли размещать его на сайте DBA? – Itay
Я полагаю, что я еще не являюсь участником этого сайта, и я видел похожие вопросы, которые были опубликованы здесь. – Elie
Вы еще выполнили 'EXPLAIN