2010-05-03 2 views
18

У меня есть таблица для около 100 000 пользователей.Оценка производительности MySQL

Первый случай:

explain select state, count(*) as cnt from users where state = 'ca' 

Когда я объяснить план для приведенного выше запроса я получаю стоимость, как 5200

Второй случай:

Create or replace view vw_users as select state, count(*) as cnt from users 

Explain select cnt from vw_users where state = 'ca' 

Когда я объяснить план по второму запросу я получаю стоимость 100 000.

Как работает предложение where в представлении? Применяется ли предложение where после просмотра всех строк? Как исправить эту проблему?

+2

Ваше определение мнение отсутствует предложение по группе. –

+0

Если вы не можете использовать алгоритм слияния, вот работа, которую я нашел полезной: [Обход проблемы для проблем с искушаемыми видами] (http://www.mysqlperformanceblog.com/2010/05/19/a-workaround- for-the-performance-problems-of-temptable-views /) – landoncz

ответ

28

Это около view algorithm, которые были использованы.

Слияние алгоритм хорошо работает большинство таблиц индексов и этажерку - алгоритм TempTable не - во многих случаях ваши индексы будут просто утончаются вообще не используется.

И есть много дерьма, что слияние не поддерживает

MERGE не может быть использован, если вид содержит любой из следующих конструкций:

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth) 
* DISTINCT 
* GROUP BY 
* HAVING 
* LIMIT 
* UNION or UNION ALL 
* Subquery in the select list 
* Refers only to literal values (in this case, there is no underlying table) 
+0

Питер, спасибо за ввод. У меня есть счет (*), на мой взгляд. Поэтому я не могу использовать слияние. Прямо сейчас я не указывал тип алгоритма. Таким образом, лучший способ может использовать хранимую процедуру вместо представления? – vamsivanka

+0

Да, вам придется искать здесь хранимую процедуру - или просто подзапрос. –

+0

Питер, спасибо. – vamsivanka

Смежные вопросы