2

MySQL VIEW についてもっと調べようとしていますが、まだかなり混乱しています (特に詳細について)。

正しく理解すれば、ビューは、使用される保存された SELECT クエリ以上のものではありません。しかし、私の問題は、VIEW 内の WHERE 句に特定の値を使用したいときに始まります。

次の VIEW があるとします。

SELECT `user`.`id`, `userrole`.`key` AS `role`, `userstatus`.`key` AS `status`
FROM `user`
LEFT JOIN `userrole`
ON `userrole`.`id` = `user`.`userrole_id`
LEFT JOIN `userstatus`
ON `userstatus`.`id` = `user`.`userstatus_id`

現在、これにより、すべてのユーザーのリストが現在の役割/ステータスとともに提供されます

+----+-------+--------+
| id |  role | status |
+----+-------+--------+
|  1 | admin | active |
|  2 |  user | active |
|  3 |  user | active |
|  4 | admin | active |
| .. |   ... |    ... |
+----+-------+--------+

今、私は 3 のユーザーの役割/ステータスを知りたいだけなので、で をID追加する必要がありSELECTますよね? しかし、私がそれを行うと、正確にはどうなりますか?VIEWWHERE id = 3

すべてのユーザーをVIEW静止させ、データ全体を削除して、 のみを表示しますか? それとも、のみが選択されるように最適化されますか?SELECTid = 3VIEWuser.id = 3

私はこれのパフォーマンス面について混乱しています.100万人のユーザーがいる場合、VIEWこれに a を使用するのはかなり悪い考えです. しかし一方で、私がこれに を持っているなら、私は毎回SELECTすべての's で全体を使用するために自分自身を保存します。JOINVIEW

VIEWでは、行為はどのように正確に行われますか?WHERE単純な SUBQUERY として、またはを選択するときにを追加すると、より最適化されますVIEWか?

それが SUBQUERY のように機能する場合、STORED PROCEDUREパラメーター付きの は常に よりも優れているとVIEW思います(WHERE異なるパラメーターがある場合)?

情報をありがとう

4

1 に答える 1

2

最適化されます。

ビューは、マクロまたはエイリアスと考えることができます。実行時にビューを使用すると、ビューの SQL テキスト全体がビューを使用するクエリに展開されます。次に、クエリ オプティマイザは、結合されたクエリで実際に使用されている列と行のみを選択します。

入力すると

SELECT `id`, `role` FROM YourView
WHERE `status` = 4

に展開されます

SELECT `id`, `role` FROM 
(
SELECT `user`.`id`, `userrole`.`key` AS `role`, `userstatus`.`key` AS `status`
FROM `user`
LEFT JOIN `userrole`
ON `userrole`.`id` = `user`.`userrole_id`
LEFT JOIN `userstatus`
ON `userstatus`.`id` = `user`.`userstatus_id`
)
WHERE `status` = 4
于 2012-10-11T10:57:33.737 に答える