MySQL запрос вычисляемый столбец - PullRequest
0 голосов
/ 05 октября 2011

У меня есть следующие запросы:

SELECT a.Id, a.Name, (SELECT COUNT(Id) FROM b WHERE b.IdTableA = a.Id) AS Num
FROM a
ORDER BY a.Name

таблица b имеет FK для таблицы a (IdTableA). В этом случае это эффективно?Есть ли другой способ сделать это?

Другой вопрос:

SELECT client.Id, client.Name
     ,(SELECT SUM(projects) FROM projects WHERE IdClient = client.Id) AS projects
FROM client

Как насчет этого?

Иногда нам нужно использовать более одного вычисляемого столбца(ВЫБЕРИТЕ СУММУ), даже 10 или 15.

Мы очень обеспокоены производительностью, поскольку в табличных проектах может быть более 500 тыс. Записей.

Я читал, что хранение этих SUMS в таблицеи обновите эту таблицу, когда изменения данных могут улучшить производительность.Но это идет вразрез с нормализацией ...

Пожалуйста, помогите мне с обоими запросами ...

Спасибо

1 Ответ

2 голосов
/ 05 октября 2011
SELECT a.Id, a.Name, (SELECT COUNT(Id) FROM b WHERE b.IdTableA = a.Id) AS Num
FROM a
ORDER BY a.Name

можно переписать как

SELECT a.Id, a.Name, COUNT(b.Id) AS Num
FROM a JOIN b ON b.IdTableA = a.Id 
GROUP BY a.Id, a.Name
ORDER BY a.Name

, что снижает риск неправильного выполнения MySQL.

Хранение сумм данных для удобного поиска допустимо при наличии намного больше операций чтения, чем записи (или когда запись разрешена быть медленной, но чтение должно быть быстрым).Обычно для этого используется хранилище данных: хранилище хранит совокупные данные, а база данных OLTP хранит отдельные строки.

...