MySQLとOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)

MySQLとOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)

1. 同時実行性

同時実行性は OLTP データベースの最も重要な機能ですが、同時実行性にはリソースの取得、共有、ロックが含まれます。

マイスク:
MySQL は主にテーブル レベルのロックを使用し、リソース ロックの粒度は非常に大きくなります。セッションがテーブルを長時間ロックすると、他のセッションはこのテーブルのデータを更新できなくなります。
InnoDB エンジン テーブルでは行レベル ロックを使用できますが、この行レベル ロックのメカニズムはテーブルのインデックスによって異なります。テーブルにインデックスがない場合、または SQL ステートメントでインデックスが使用されていない場合は、テーブルレベル ロックが引き続き使用されます。

オラクル:
Oracle は行レベルのロックを使用します。これは、リソース ロックの粒度がはるかに小さいロックです。SQL に必要なリソースのみがロックされ、ロックはインデックスに依存せず、データベースのデータ行に対して行われます。したがって、Oracle の同時実行性のサポートははるかに優れています。

2. 一貫性

オラクル:
Oracle は、最高レベルの読み取り一貫性を実現できるシリアル化可能な分離レベルをサポートしています。各セッションが送信されると、他のセッションで送信された変更を確認できるようになります。 Oracle は、UNDO 表領域にマルチバージョンのデータ ブロックを構築することで読み取り一貫性を実現します。
各セッションがクエリを実行するときに、対応するデータ ブロックが変更されると、Oracle は UNDO 表領域にこのセッションの古いデータ ブロックを構築します。

マイスク:
MySQL には、Oracle のようなマルチバージョン データ ブロックを構築するメカニズムがなく、読み取りコミット分離レベルのみをサポートしています。 1 つのセッションがデータを読み取る場合、他のセッションはデータを変更することはできませんが、テーブルの最後にデータを挿入することはできます。
セッションがデータを更新する場合、他のセッションがデータにアクセスできないように排他ロックを追加する必要があります。

3. 事務

Oracle は長年にわたりトランザクションを完全にサポートしてきました。

MySQL は、InnoDB ストレージ エンジンの行レベルのロックのみを使用したトランザクションをサポートします。

4. データの永続性

オラクル
Oracle は送信された SQL 操作行をオンライン ログ ファイルに書き込み、ディスクに保存するため、送信されたデータが回復可能であることを確認します。
データベースまたはホストが異常に再起動した場合、Oracle はオンライン ログを使用して、再起動後に顧客が送信したデータを回復できます。
マイスク:
デフォルトでは、SQL ステートメントが送信されますが、更新プロセス中にデータベースまたはホストの再起動に問題が発生すると、データが失われる可能性があります。

5. 提出方法

Oracle はデフォルトでは自動的に送信しないため、ユーザーが手動で送信する必要があります。
mysql のデフォルトは自動コミットです。

6. 論理バックアップ

Oracle は論理バックアップ中にデータをロックしないため、バックアップされたデータは一貫性を保ちます。

MySQL の論理バックアップを実行する場合、バックアップされたデータの一貫性を確保するためにデータをロックする必要があり、これはビジネスにおける DML の通常の使用に影響します。

7. ホットバックアップ

Oracle には成熟したホット スタンバイ ツールである RMAN があり、これはホット スタンバイ中にユーザーによるデータベースの使用に影響を与えません。バックアップされたデータベースに不整合がある場合でも、アーカイブ ログとオンライン REDO ログを通じて一貫性のある復元が可能です。
マイスク:
myisam エンジンで mysql の mysqlhostcopy ホット スタンバイ機能を使用する場合、テーブルに読み取りロックを追加する必要があり、これは dml 操作に影響します。
Innodb エンジンでは、Innodb テーブルとインデックスはバックアップされますが、.frm ファイルはバックアップされません。 ibbackup を使用してバックアップすると、バックアップ期間中のデータの変更を記録するログ ファイルが作成されるため、テーブルをロックする必要がなく、他のユーザーによるデータベースの使用に影響しません。ただし、このツールは有料です。
innobackup は、ibbackup と組み合わせて使用​​され、.frm ファイルのバックアップを支援するスクリプトです。

8. SQL文の拡張性と柔軟性

MySQL には、limit 関数、一度に複数行のデータを挿入できる insert 関数、from を追加せずに特定の管理データを選択できる select 関数など、SQL 文に対する非常に実用的で便利な拡張機能が多数あります。
この点では、Oracle の方が安定していて伝統的であるように感じます。

IX. コピー

Oracle: プッシュまたはプルの従来のデータレプリケーションと、DataGuard のデュアルマシンまたはマルチマシンの災害復旧メカニズムの両方を備えています。メインデータベースに問題が発生した場合、バックアップデータベースをメインデータベースに自動的に切り替えることができますが、構成管理はより複雑になります。
mysql: レプリケーション サーバーの構成はシンプルですが、メイン データベースに問題が発生すると、クラスター データベースの一部のデータが失われる可能性があります。また、クラスター データベースをメイン データベースに手動で切り替える必要があります。

10. パフォーマンス診断

Oracle には、多くの自動分析および診断機能を実装できる、成熟したさまざまなパフォーマンス診断およびチューニング ツールがあります。 awr、addm、sqltrace、tkproof など。
MySQL の診断およびチューニング方法は、主にスロークエリログに限られ、ほとんどありません。

11. 権限とセキュリティ

mysql ユーザーはホストに関連付けられているため、意味がないように見えます。また、ホストと IP が偽造されやすくなります。
Oracle の権限とセキュリティの概念は、比較的伝統的かつ標準的です。

12. パーティションテーブルとパーティションインデックス
Oracle のパーティション テーブルとパーティション インデックス機能は非常に成熟しており、DB にアクセスする際のユーザー エクスペリエンスを向上させることができます。
MySQL のパーティション テーブルはまだ成熟しておらず、安定していません。

13. 管理ツール
Oracle には、成熟したさまざまなコマンド ライン、グラフィカル インターフェイス、Web 管理ツール、および多数のサードパーティ管理ツールが用意されており、管理が非常に便利かつ効率的になります。
MySQL 管理ツールは少ないです。Linux で管理ツールをインストールするには、追加のパッケージ (phpmyadmin など) のインストールが必要な場合があり、やや複雑です。

14. テクニカルサポート

Oracleに問題がある場合は、カスタマーサービスにお問い合わせください。

mysqの問題を自分で解決する

15. 認可

オラクルの料金

mysq オープンソース - 無料

16. 選択

お金に余裕があれば、Oracle を使用することをお勧めします。

お金はないけどニーズを満たすことができるなら、mysq を使うことをお勧めします。 (Alibaba、Wikipedia などの大規模プロジェクトでも MySQL が使用されており、主に分散ストレージ、キャッシュ、テーブルとデータベースのシャーディングなどのテクノロジーが使用されています)

主に SQL の観点から比較した別の記事を次に示します。

Oracle データベースと MySQL データベースの違いがこの記事の主な内容です。お役に立てれば幸いです。

1. グループ機能の使用ルール

MySQL では、グループ関数は SELECT 文で自由に使用できますが、Oracle では、クエリ文にグループ関数がある場合、他の列名はグループ関数によって処理されるか、group by 句内の列である必要があります。そうでない場合は、エラーが報告されます。

例えば:

select name, count(money) from user; これは MySQL では正常に動作しますが、Oracle では問題が発生します。
そして、名前でユーザー グループから name、count(money) を選択するか、ユーザーから max(name)、count(money) を選択します。
Oracle ではエラーは発生しませんし、同様に MySQL でもエラーは発生しません。

2. 自動成長データ型処理

MYSQL には自動的に増加するデータ型があります。レコードを挿入するときにこのフィールドを操作する必要はなく、データ値は自動的に取得されます。 ORACLE には自動的に増加するデータ型がないため、レコードを挿入するときに、自動的に増加するシーケンス番号を作成し、シーケンス番号の次の値をこのフィールドに割り当てる必要があります。

CREATE SEQUENCE シーケンス番号名 (できればテーブル名 + シーケンス番号タグ) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;

最大値はフィールドの長さによって決まります。自動的に増加するシーケンス番号NUMBER(6)が定義されている場合、最大値は999999です。

INSERT ステートメントは、このフィールド値を挿入します: シリアル番号の名前。NEXTVAL

3. シングルクォートの処理

MYSQL では、文字列を囲むのに二重引用符を使用できますが、ORACLE では、文字列を囲むのに一重引用符のみを使用できます。文字列を挿入および変更する前に、一重引用符を置き換える必要があります。一重引用符のすべての出現箇所は、2 つの一重引用符に置き換えられます。

4. ページめくりのためのSQL文の処理

MYSQL でページめくりを処理するための SQL 文は比較的簡単です。LIMIT を使用して開始位置を設定し、その数を記録します。PHP では、SEEK を使用して結果セットの位置を特定することもできます。 ORACLE がページめくりを処理するための SQL 文はかなり複雑です。各結果セットには、その位置を示す ROWNUM フィールドが 1 つだけあり、ROWNUM<100 のみ使用でき、ROWNUM>80 は使用できません。

以下は、分析後の 2 つの ORACLE ページめくり SQL ステートメントの改善です (ID は一意のキーワードのフィールド名です)。

声明1:

SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE condition1 ORDER BY condition2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY condition3;

声明2:

SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE condition1 ORDER BY condition2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY condition3;

5. 長い文字列の処理

ORACLE には、長い文字列を処理するための独自の特別な機能もあります。 INSERT および UPDATE で操作可能な文字列の最大長は、4000 バイト以下です。より長い文字列を挿入する場合は、ORACLE に付属の DBMS_LOB パッケージを使用して、フィールドに CLOB タイプを使用することを検討してください。レコードを挿入または変更する前に、空でないかどうかと長さのチェックを実行する必要があります。空にできないフィールド値と長さを超えるフィールド値では警告が発行され、最後の操作に戻ります。

6. 日付フィールドの処理

MYSQL の日付フィールドは、DATE と TIME に分かれています。ORACLE の日付フィールドには、年、月、日、時、分、秒の情報を含む DATE のみがあります。現在のデータベースのシステム時間は SYSDATE で、秒単位の精度です。または、文字列が日付型に変換されます。関数 TO_DATE('2001-08-01','YYYY-MM-DD') 年-月-日 24 時間: 分: 秒形式 YYYY-MM-DD HH24:MI:SS TO_DATE() 他にも多くの日付形式があります。ORACLE DOC を参照してください。日付フィールド変換文字列関数 TO_CHAR('2001-08-01','YYYY-MM-DD HH24:MI:SS')

日付フィールドの数式は非常に異なります。 MYSQL は、DATE_FIELD_NAME > SUBDATE(NOW(), INTERVAL 7 DAY) を使用して、現在の時刻から 7 日後の日付を検索します。ORACLE は、DATE_FIELD_NAME > SYSDATE - 7 を使用して、現在の時刻から 7 日後の日付を検索します。

現在の時刻を挿入する MYSQL の関数は次のとおりです。NOW() 関数は、現在の日付と時刻を `'YYYY-MM-DD HH:MM:SS' として返します。これは、DATETIME フィールドに直接保存できます。 CURDATE() は今日の日付を 'YYYY-MM-DD' の形式で返し、DATE フィールドに直接保存できます。 CURTIME() は、現在の時刻を 'HH:MM:SS' の形式で返し、TIME フィールドに直接保存できます。例: テーブル名 (フィールド名) の値に挿入 (now())

Oracleの現在の時刻はsysdateです

7. ヌル文字の扱い

MYSQL の空でないフィールドには空の内容も含まれますが、ORACLE では空でないフィールドに空の内容が許可されません。 MYSQL の NOT NULL に従って ORACLE テーブル構造を定義すると、データのインポート時にエラーが発生します。そのため、データをインポートする際には、空文字を判定する必要があります。NULL または空文字の場合は、スペースの文字列に変更する必要があります。

8. 文字列のあいまい比較

MYSQL では、%' 文字列 %' のようなフィールド名を使用します。ORACLE でも、%' 文字列 %' のようなフィールド名を使用できますが、この方法ではインデックスを使用できず、高速ではありません。文字列比較関数 instr(フィールド名、' 文字列 ')>0 を使用すると、より正確な検索結果が得られます。

9. プログラムおよび関数では、データベース操作が完了した後に結果セットとポインターを解放するように注意してください。

以下もご興味があるかもしれません:
  • MySQLとOracleの誤解の詳細な説明
  • SpringBoot マルチデータベース接続 (mysql+oracle) の実装
  • MySQLからOracleへのリアルタイム同期ソリューションの詳細な説明
  • Oracle の MySQL バージョンでユーザー Scott のテーブル ステートメントを作成する例
  • mysql と oracle のデフォルトのトランザクション分離レベルの説明
  • MyBatis JdbcType と Oracle および MySql データ型の対応の説明
  • Oracle Rownum 書き込みに似た MySQL の詳細な例
  • 3つの主要データベース(Mysql、SqlServer、Oracle)の違いについて簡単に説明します。
  • Oracle を MySQL に置き換える際の問題と解決策

<<:  Vueの最初のプログラムを書くための勉強ノート

>>:  Ubuntu 20.04 IPアドレスを変更する方法の例

推薦する

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

Ubuntu システムでタイムゾーンと時刻を変更する方法

Linux コンピュータには 2 つの時間があります。1 つはハードウェア時間 (BIOS に記録さ...

Zabbix ベースの Jenkins プロセス監視の詳細な説明

1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...

Docker+Jenkinsを使用して自動的にビルドおよびデプロイする

この記事では、Docker+Jenkins の自動ビルドデプロイメントを紹介し、皆さんと共有します。...

vue data が関数である理由をご存知ですか?

公式サイトの説明: コンポーネントを定義する場合、コンポーネントは複数のインスタンスを作成するために...

Nginx Httpモジュールシリーズにおけるautoindexモジュールの具体的な使用法

ブラウザ モジュールの主な機能は、http リクエスト ヘッダーの「User-Agent」の値とブラ...

MySQLでMyISAMストレージエンジンをInnodbに変更した操作記録のまとめ

一般的に、MySQL はデフォルトでさまざまなストレージ エンジンを提供しており、次のように表示され...

HTMLの基礎を徹底解説(第1部)

1. WEBを理解するWeb ページは主にテキスト、画像、ハイパーリンクなどの要素で構成されていま...

よく使われるn番目の子セレクターをまとめる

序文フロントエンドプログラミングでは、奇数、偶数などの数値を受け入れることができる nth-chil...

IdeaでTomcatを起動したときに複数のリスナーが報告される問題を解決する

エラーのスクリーンショット例外が発生した場所が見つかりません。解決策: リソースディレクトリにlog...

vsftpd ユーザーが ssh 経由でログインすることを禁止する方法

序文vsftp は使いやすく安全な FTP サーバー ソフトウェアです。システムユーザーまたは仮想ユ...

Vue スキャフォールディングでのレンダリングを理解する

Vue スキャフォールディングでは、エントリ ファイル main.js の新しい Vue コードに、...

VMware15 の Deepin インストール詳細チュートリアル (画像とテキスト)

序文Deepin のユーザー インターフェイスは、使用時に非常に見栄えがします。インターフェイス効果...

Windows で mysql 8.0.12 をインストールするための詳細なチュートリアル

この記事では、MySQL 8.0.12のインストール方法に関する詳細なチュートリアルを参考までに紹介...

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...