Насколько большой слишком большой для просмотра в MySQL InnoDB? - PullRequest
4 голосов
/ 24 ноября 2011

ПРЕДПОСЫЛКИ

Я работаю с базой данных MySQL InnoDB с более 60 таблицами и создаю различные представления для быстрого и простого выполнения динамических запросов.код.У меня есть пара просмотров с ВНУТРЕННИМИ СОЕДИНЕНИЯМИ (без отношений «многие ко многим»): 20 to 28 tables ВЫБОР 100 to 120 columns с row count below 5,000, и он работает быстро.

АКТУАЛЬНАЯ ПРОБЛЕМА

Я создаю мастер-представление с ВНУТРЕННИМИ СОЕДИНЕНИЯМИ (без связей "многие-ко-многим") 34 tables и ВЫБЕРИВАЮ 150 columnsrow count below 5,000 и кажется, что это слишком.Это займет целую вечность, чтобы сделать один выбор.Мне интересно, достигну ли я какого-нибудь предела размера изображения и есть ли способ увеличить его, или какие-нибудь хитрости, которые помогут мне преодолеть этот очевидный предел.

Важно отметить, что я НЕ ИСПОЛЬЗУЮ Aggregate functions, потому что я знаю об их негативном влиянии на производительность, что, кстати, меня очень беспокоит.

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

MySql не использует «алгоритм System R» (используемый Postgresql, Oracle и SQL Server, я думаю), который учитывает не только разные алгоритмы слияния (MySQL имеет только вложенный цикл, хотя вы можете подделать хеш-соединениес помощью хэш-индекса), а также возможные способы объединения таблиц и возможных комбинаций индексов.В результате получается, что синтаксический анализ запросов и их выполнение могут быть очень быстрыми, но производительность может резко снизиться, когда оптимизатор выберет неверный путь через данные.

Посмотрите на свойобъясните планы и постарайтесь выяснить, а) связано ли падение производительности с числом возвращаемых столбцов (просто выберите SELECT 1 или что-то в этом роде) или b) с оптимизатором, выбравшим сканирование таблицы вместо использования индекса.

3 голосов
/ 24 ноября 2011

Представление - это просто именованный запрос. Когда вы ссылаетесь на представление в MySQL, оно просто заменяет имя реальным запросом и запускает его.

Кажется, вы путаете его с материализованными представлениями, которые представляют собой таблицы, которые вы создаете из запроса. После этого вы можете запросить эту таблицу, и вам больше не придется делать исходный запрос.

Материализованные представления не реализованы в MySQL.

Чтобы повысить производительность, попробуйте использовать ключевое слово объяснение , чтобы узнать, где можно оптимизировать свой запрос / представление.

...