2013-09-09 2 views
3

У меня есть представление, определенное следующим образом:Как оптимизировать производительность 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; 
+0

Неправильно ли размещать его на сайте DBA? – Itay

+1

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

+2

Вы еще выполнили 'EXPLAIN