質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

231閲覧

MySQLのビューについて教えてください

Ruri5280

総合スコア309

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2023/09/22 14:52

実現したいこと

時間のかかるクエリを可能なかぎり高速で取得したいのですが
知識が乏しいため質問させて頂きました

教えて欲しいこと

販売テーブルと仕入れテーブルいずれも35万件ほどのレコードがあり
商品別、取引展別などで集計したいのですが、データ量が多く
1回のSQLが非常に長いため、ビューにした方が良いのかと考えました

上記の35万件のテーブルはいずれも過去のバックアップテーブルとして存在しているため
日常的に更新されることはありません、

ビューの場合、初回のビュー作成には非常に時間がかかるものと思われますが
更新がないとすると 基本的にビューの更新は初回のみでその後は更新されない?という理解であっていますでしょうか。

また、select * from ビュー where 条件で抽出されるSQLの実行時間は、
通常のSQLと比較して格段に早くなるよいう認識であっていますでしょうか

ご存知の方、どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/09/22 20:36

テーブル定義にもよると思います 。仮に組んでみて実行計画とってみましたか?
guest

回答2

0

ベストアンサー

MySQLのビュー

パフォーマンス改善を目的としたビューということは、マテリアライズドビューを想定されているのかもしれませんが
MySQLにマテリアライズドビューはありません。
https://dev.mysql.com/doc/refman/8.0/ja/faqs-views.html#faq-mysql-have-materialized-views

1回のSQLが非常に長いため、ビューにした方が良いのかと考えました

何度も同じようなクエリを書くのが大変……ということであれば、普通のビューは役立ちます。
(※性能改善ではなく、手間の削減や再利用性向上など目的で)

ビューの場合、初回のビュー作成には非常に時間がかかるものと思われますが

ビューは、定義するだけでは特に負荷はかかりません。

また、select * from ビュー where 条件で抽出されるSQLの実行時間は、
通常のSQLと比較して格段に早くなるよいう認識であっていますでしょうか

ビューに対するクエリは、実際にはビューが参照する実テーブルへのクエリとして実行されるので
実行時性能が改善することは基本的にありません。

むしろ、集約処理(GROUP BYとか)を含むビューを作成し、後からWHEREを加えて抽出する場合などは
本来の元テーブルへのクエリ(WHEREしてからGROUP BY)より性能劣化が起こりえます。

一般的なマテリアライズドビュー

MySQLには存在しませんが、他DBMSでのマテリアライズドビューについて一般的な回答をしますと
マテリアライズドビュー初回作成時および追加更新削除時の負荷は増えますが
その分複雑なJOINやGROUP BYやORDER BYを含むクエリであっても性能改善が期待できます。

MySQLでの性能改善方法

MySQLで性能改善が必要な場合は

  • インデックスや既存クエリ自体の見直し
    ※基本的なやつ
  • サーバ物理性能のスケールアップ、MySQLサーバのパラメータ見直し
    ※ごく普通のDBチューニング
  • マテリアライズドビューの自力実装
  • 水平分割(パーティショニング)

などがあります

クエリやインデックス、サーバ本体やDB設定での改善がこれ以上見込めないのであれば、以降の対策をせざるを得ないかもしれません

マテリアライズドビュー自力実装は、普通の実テーブルをビュー代わりに使用します。
(マテリアライズド)ビュー定義と同じような構造になるようにCREATEし、ビュー同等のクエリでそのままINSERT-SELECTして初期化します。
元テーブルへの更新追随は、全ての元テーブルに対する各種トリガーで常時追随する方法や、定期的なテーブル丸ごと初期化(中身総入れ替え)処理などで実現します。
SELECTクエリの性能改善を期待はできますが、整合性を保つためにかなり面倒になるデメリットもあります。

水平分割とは、たとえば「年をまたいだ集計処理はしない」前提であればデータを年ごとに分割してDB内部で管理させることで性能改善が見込めたりします。
ただし管理がやたら複雑になったり前提を満たさないとろくに性能改善できなかったりするので、事前にしっかりと検討や検証が必要です。
(※理屈としては知っていますが実際やったことはないのであまり正確な情報提供はできません)

投稿2023/09/23 04:45

pecmm

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すごく丁寧な説明ありがとうございます!
トライしてみます!

投稿2023/09/25 01:52

Ruri5280

総合スコア309

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問