Я работаю над веб-проектом с базой данных MySql на Java EE. Нам понадобилось представление для суммирования данных из 3 таблиц с более чем 3М строками в целом. Каждая таблица была создана с индексом. Но я не нашел способ воспользоваться преимуществами индексов в извлечения условного выбора из представления, которое мы создали с помощью [group by].
У меня есть предложения от людей, что использование просмотров в MySql - не очень хорошая идея. Потому что вы не можете создать индекс для представлений в mysql, как в oracle. Но в некоторых тестах, которые я взял, индексы можно использовать в предложении select select. Возможно, я создал эти представления неправильным образом.
Я опишу пример для описания моей проблемы.
У нас есть таблица, которая записывает данные для высоких баллов в играх NBA, с индексом в столбце [happend_in]
CREATE TABLE `highscores` (
`tbl_id` int(11) NOT NULL auto_increment,
`happened_in` int(4) default NULL,
`player` int(3) default NULL,
`score` int(3) default NULL,
PRIMARY KEY (`tbl_id`),
KEY `index_happened_in` (`happened_in`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
вставить данные (8 строк)
INSERT INTO highscores(happened_in, player, score)
VALUES (2006, 24, 61),(2006, 24, 44),(2006, 24, 81),
(1998, 23, 51),(1997, 23, 46),(2006, 3, 55),(2007, 24, 34), (2008, 24, 37);
то я создаю представление, чтобы увидеть самый высокий балл, который Коби Брайант получил в каждый год
CREATE OR REPLACE VIEW v_kobe_highScores
AS
SELECT player, max(score) AS highest_score, happened_in
FROM highscores
WHERE player = 24
GROUP BY happened_in;
Я написал условное утверждение, чтобы увидеть наивысший результат, который kobe получил в 2006;
select * from v_kobe_highscores where happened_in = 2006;
Когда я объясню это в toad для mysql, я обнаружил, что mysql имеет проверку всех строк, чтобы сформировать представление, а затем найти данные с условием в нем, не используя индекс на [used_in].
explain select * from v_kobe_highscores where happened_in = 2006;
Вид, который мы используем в нашем проекте, построен среди таблиц с миллионами строк. Сканирование всех строк из таблицы в каждом представлении данных является неприемлемым. Пожалуйста помоги! Спасибо!
@zerkms Вот результат, который я тестировал в реальной жизни. Я не вижу больших различий между ними. Я думаю, что @spencer7593 имеет правильную точку. Оптимизатор MySQL не "нажимает" этот предикат в запросе представления.