2016-05-26 2 views
0

Это вопрос производительности.msql query или mysql view

Допустит, у меня есть следующая MySQL данные (более 1000 записей той же структура)

имени

стола: часы

Employee | Hours | Scope | Project 
John  4  labour  projId_A 
John  3  Travel  projId_A 
Mark  4  labour  projId_A 
Mark  2  Travel  projId_A 

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

имя таблицы: проекты (я бы оставил присоединиться проекты и часы)

Project | labourHrs | travelHrs 
projId_A  8    5 

или нам это лучше

  1. создать представление, которое показывает только labourHrs
  2. создать представление, которое показывает только travelHrs

Затем создать 2 стыки проекты -> labourH и проекты -> travelH

получить:

Project | labourHrs | travelHrs 
projId_A  8    5 

Я думаю, что я спрашиваю, лучше ли делать сумму внутри запроса проекта или внутри labour_view & travel_view '

любые мысли?

+0

По моему опыту, ПРОСМОТРЫ никогда не помогают производительности (кроме, возможно, уменьшения вероятности того, что другие делают более бедные версии одного и того же запроса); они также стремятся сделать отладку намного сложнее, поскольку MySQL не просто «присоединяется» к результатам, как если бы они были таблицей, она пытается интегрировать запросы позади них с запросом, в котором используется представление, и не всегда ожидаемыми способами. (Простой пример: запрос SELECT * FROM aTable в виде вида, называемого «view1», сначала не будет выбирать все из 'aTable', если вы выполните SELECT * FROM view1 WHERE id = 1', он будет запускать базовый запрос с помощью условие.) – Uueerdo

ответ

3

Лучше сделать один запрос:

select project 
     sum(case when score = 'labour' then hours else 0 end) as labourHrs, 
     sum(case when score = 'travel' then hours else 0 end) as travelhours 
from t 
group by project; 

С точки зрения производительности в MySQL, точки зрения не улучшают производительность. Они могут не повлиять на производительность, но они не улучшатся.

+0

Они быстрее, если вы можете материализовать их, но, к сожалению, у MySQL нет этой функции. – tadman

+0

Единственная причина, по которой я думаю о представлении, состоит в том, что я имею дело с временными картами quickBooks, которые они хранят так: PT3H30M. Это означает, что мне нужно подстроить() PT, H, M, чтобы получить числа (3, 30). поэтому, когда у меня есть «часы», мне нужно иметь дело с «PT3H30M». Я хочу посмотреть, могу ли я создавать представления, которые подстроки() PT3H30M, негативно влияют на производительность. Имеет ли это смысл? – user2062455

+0

@ пользователь2062455. , , Преобразования с одним столбцом отлично подходят для просмотра. Не стесняйтесь определять представление для извлечения часов из этого столбца. –

0

Представления обычно используются для скрытия данных или упрощения запроса. Используйте свой первый вариант и выполните SUM в исходном SQL.