いくつかのマイナーな問題をのmysql

関連キーワード

MySQLのインデックスについてここでは要約記事リンクMySQLのインデックスの原理と最適化を実施していました。

1.インデックスとは何ですか?

インデックスは、迅速にデータを見つけるために私たちを助けることができるデータ構造です。

2.インデックスは、どのようなデータ構造のでしょうか?

データ構造とMySQLでの多くの指数の使用に関連する特定のストレージエンジンのインデックスがハッシュインデックス、B +ツリーインデックス、私たちはしばしば達成するために使用するデフォルトのストレージエンジンInnoDBはインデックス:B +ツリーインデックスを。

3.ハッシュB +ツリーインデックスとの違いや、それのすべての長所と短所は何ですか?

ハッシュインデックスは、最初に知っていて、B +ツリーインデックスの実装の原則を基礎となる必要があります。

ハッシュインデックスは、検索したときに、基本となるハッシュテーブルで、ハッシュ関数を呼び出す実装の基礎となる実際のデータ.B +ツリーを取得するには、テーブルへのクエリバックに続いて、適切なキーに取得することができ、よりバランスの取れた探索木を超えています。すべてのクエリについてルートから、それが必要であるかどうかのクエリに応じてバックテーブル、クエリデータに、検索キーを得ることができるリーフノードのパーティーを見つけ、そして。

我々は、彼らが次のような違いがあることを確認できます。

  • ハッシュインデックス同等のクエリを高速化(一般的に)、それは、クエリの範囲にすることはできません。

次に、ハッシュ関数のハッシュ・インデックスを介してインデックスを付けているので、元の順序と配列のインデックスが一致しないことができ、我々は、範囲クエリをサポートすることができない。そして、すべてのB +ツリーの左ノードが少ない親ノードよりも(右ノードが親よりも大きく、より追従しているノードツリーには、ネイティブサポートの範囲、)も同様です。

  • ハッシュインデックスは、上記のソート原則インデックスの使用をサポートしていません。
  • ハッシュインデックスはあいまいクエリをサポートしていないと、ほとんどの左前方一致の原則のためでも予測不可能.AAAAとAAAABインデックスハッシュ関数のマルチカラムインデックスは関係ありません。
  • 特定の条件がインデックスのみによって(等、インデックスをカバーする、クラスタ化インデックス)を満たしている場合にB +ツリー照会を行うことができるが、ハッシュインデックスは、テーブルへのデータバックを照会するために、常に回避することはできません。
  • 、高速ハッシュ等価クエリのインデックスが、不安定。予測不可能な性能が、ハッシュの衝突が発生したときに重複キーの数が多い場合には、効率が悪いことができる。クエリ効率B +ツリーは比較的安定していますすべてのクエリのルートリーフノードにノード、ツリーの高さが低いからです。

そのため、ほとんどの場合、直接使用するハッシュインデックスを必要とせずに、安定かつ優れたクエリの速度を得ることができ、B +ツリーインデックスを選択します。

4.上記のB +ツリーの上にクラスタ化インデックスを満たすために、インデックスをカバーするために、時間内のテーブルへのデータバックを照会する必要はありませんが、クラスタ化インデックスは何ですか?

インデックスB +ツリーのリーフノードは、現在のキー値を格納することができる、また、現在のキー値とインデックスと非クラスタ化インデックスをクラスタ化されたデータの行全体に格納することができる。でInnoDBは、唯一の主キーインデックスでありますクラスタ化インデックスは、主キー場合は、クラスタ化インデックスを確立するために、一意のキーを選択します。その後、暗黙的にクラスタ化インデックスキーを構築するために生成された一意のキーがない場合。

クラスタ化インデックス、対応するリーフノードを使用してクエリは、あなたがデータの行全体を取得することができた場合、そのテーブルにこの時間戻ってはいけません。

5.非クラスタ化インデックステーブルクエリはそれを返すのだろうか?

必ずしもそうではありません、これは必要なすべてのフィールドがインデックスにヒットするかどうかの問合せが含まれ、インデックスがすべてヒットした場合は、テーブルクエリに戻ってである必要はありません。

ここでは簡単な例である、そして、私たちは従業員表の年齢にインデックスを作成したとするときの年齢クエリ<20は、インデックスのリーフ・ノードでは、まだありませんもう一度、情報化時代が含まれている従業員から選択年齢テーブルクエリに戻って。

インデックスを作成するとき6.、それを考慮すべき要素は何ですか?

あなたが共同インデックスを確立する必要がある場合は、アカウントに使用フィールドの頻度を取るために、一般的なインデックス、条件が適しているとして、多くの場合、クエリフィールドが、それはまた、共同インデックスの順である場合には他にも、このような過度のを防止するように他の側面を考慮検討する必要があります。テーブルの上にすべての原因があまりにも多くの圧力。これらは、関連する実際のテーブル構造とクエリです。

7.どのような指標共同インデックスのためになぜ注意を払う?共同のですか?

関節のインデックスと呼ばれるインデックスを構築しながら、MySQLは複数のフィールドを使用することができます。それ以外の場合は、インデックスを打つことができない関節のインデックスでは、あなたがヒットする場合は、インデックス、フィールドの必要性は、一つのインデックス1の順序に従うこと。

具体的な理由は以下のとおりです。

インデックスindexに使用のMySQLと仮定秩序今では「名前、年齢、学校」共同指数、並べ替えのインデックスの設立:順序に従って最初に名前、同じ名前であれば、その後、ソート年齢に応じて、年齢の値が等しい場合その後、学校に応じてソート。

インデックス名は、厳格かつ秩序に従い、これだけの時間を照会すると、それは最初の名前フィールドを使用してクエリと同等でなければならない、そしてその列に一致する、厳格かつ整然とした自分の年齢のフィールドに応じて、あなたは年齢とともにフィールドを使用することができますインデックス・ルックアップ,,,そうであるので、関節指数を確立するときはインデックス列の順序は、通常の状況下で、クエリフィールドが頻繁前面に選択列を要求または高いことに留意すべきである。また、特殊なケースを照会することができるベースまたは別個調整テーブル構造。

使用されていないインデックスを作成します8.?またはどのように非常に遅い実行されているこの文の理由を知ることができますか?

MySQLは、ステートメントを実行する前に、クエリオプティマイザ以上のその文の行くを実行計画書、MySQLを表示するコマンドを説明しています。それは、多くの情報が含まれている実行計画、ある文の解析後になります。それぞれ例えばpossilbe_key、キー、key_lenに及び他の分野に関連するインデックス・ヒットは、このステートメントは、インデックスを使用してもよい示すかどうかを分析することにより、インデックス情報、実際に使用されるインデックスとインデックスの長さは、使用しました。

インデックスに何が起こるか9.そうで作成されますが、ときに、この列のクエリも使用されていませんか?

  • 使用すると、クエリに等しくありません
  • 数学や機能に関与コラム
  • 文字列は左のように「%のAAA」のようなワイルドカードであるとき。
  • 全表スキャン、分析MySQLはインデックス速いを使用した場合よりも、インデックスを使用しない場合。
  • 組み合わせ指数、フロント範囲クエリの条件、後ろの原則に沿っても、最も左接頭辞で使用する場合、インデックスを使用することはできません。

上記の場合、MySQLはインデックスを使用することはできません。

トランザクション関連

1.トランザクションとは何ですか?

何を最も古典的な重要なの栗の転送であることを理解、私は、我々はすべて知っているが、脇に言うことがないと信じています。

トランザクション内の操作は、いずれかのすべて成功するか、すべて失敗するが、これだけでは十分ではありません:トランザクションは、一連の操作で、彼らは最も一般的な理解があるのACID特性を順守しなければなりません。

何2. ACIDはい?詳細はそれについて言うことができますか?

A =不可分

原子性は、いずれかのすべての成功、またはすべて失敗し、その上にある。インポッシブル操作の一部のみを実行すること。

C =一貫性

システム(データベース)は常に中間状態無しの状態から別の一貫した状態に一貫遷移です。

I =アイソ

分離は:一般的に言えば:それは完全にコミットされる前に、トランザクションは、他のトランザクションは、一般のフロント、赤の追加の注意に表示されていない例外があることを意味しています。

D =耐久性

トランザクションがコミットされると持続性は、それは常にシステムがクラッシュしたが、トランザクションの結果に影響を与えない場合でも、このようになります。

3.同時に何が起こるかの間に複数のトランザクションがあるのですか?

次のような問題を引き起こす可能性があり、一般的に複数のトランザクションによって複雑に:

  • 汚れが読み:トランザクションをコンテンツBコミットされていないトランザクションを読み取るために、トランザクションはバックB.背後に圧延しました
  • 非反復可能読み取り:で、その間トランザクションBの操作に提出されているため、トランザクションが唯一のトランザクションの読取部Bが提出されたときに、トランザクションはAの2つのクエリになります設定することができ、その結果は、異なっていました。
  • マジックリーディング:トランザクションが「錯覚」を引き起こす挿入中、このトランザクションデータながら内容範囲Bを読み出し、..

4.どのようにそれは?MySQLのトランザクション分離レベルは、それを理解するには、これらの問題を解決するには?

次のようにMySQLの4分離レベルは以下のとおりです。

  • 非コミット読み取り(READ UNCOMMITTED)

これは、上記のように、この分離レベルの例外として知られている、あなたは他のトランザクションの一部では、このトランザクションがコミットされていない変更を見ることができます。そのため問題ダーティリード原因(他のコミットされていないトランザクションの一部を読みますが、トランザクションの後それは)ロールバックされました。

このレベルの性能は十分に大きな利点ではありませんが、そこに多くの問題があるので、ほとんど使用されません。

  • READ COMMITTED(READ COMMITTEDは)

他のトランザクションは、二度同じトランザクション内で読んで、この分離レベルは、非反復可能読み取りの問題がある。このトランザクションの一部が送信された読むことができ、結果が異なることが判明し得るために、別のトランザクションデータなぜならこれは、変更されています。

  • REPEATABLE READ(反復可能読み取り)

(名前を知っているも参照のこと)の問題を解決するための反復可能読み取り分離レベル、まだそこにある非反復可能読み取り上記の新規発行、ファントム読み取りは、データのid>の10行、すべての行関与プラスを読んだときということですそれは、新たに挿入されているので、上記の除外は、トリガーロック、クエリがあることがわかります、次のために、このトランザクションを実行しないように、読み取りロックに、そして、トランザクションデータにID = 11を新しい例外を挿入ID = 11件のデータ、最後のクエリがに取得していないし、[挿入は、主キーの競合を持つことになりながら。

  • SERIALIZABLE(直列化可能)

これは、すべての問題は、上記を解決することができ、分離の最高レベルである彼は、同時動作速度が低下するため、非常に一般的ではないにつながる可能シリアル実行の動作を強制するので、それは次のようになります。

5.のInnoDB使用分離レベル、それのどのような?

InnoDBのデフォルトは、反復可能読み取り分離レベルです。

6. MySQLのロックはそれを理解できますか?

データベースは、同時トランザクションを持っている場合は、この時間の必要性、秩序へのアクセスを確保するために、いくつかのメカニズムを一貫性のないデータを生成することが、ロック機構は、このようなメカニズムです。

ホテルの部屋のようなあなたはinとoutさまよう場合、状況はよりスナッチ同じ部屋よりになりますが、部屋はコートをロックし、キーパーソンには適用され部屋に滞在し、ロックアップすることができ、彼が使用される唯一の他人それは、再び使用することができます。

上記のロックは、それが同時の効率を妨げないように見えます何それをロックしていますか?7. MySQLの?

カテゴリが懸念しているロックから、共有ロックと排他ロックがあります。

共有ロックは:また、ユーザーがデータを読みたい読み込みロックと呼ばれ、プラスロック共有ロックを共有データは、同時により追加することができます...

排他ロック:書き込みデータ、データと排他ロック排他ロックへのユーザーの試みは唯一プラスすることができたときに書き込みロックとも呼ばれるが、彼と他の排他ロックは、共有ロックは反発しています...

複数のユーザーの上映が許容されると、上記の例を使用すると、ユーザの行動で、2があり、一つは、ビューの部屋である。一つは、滞在先の両方希望の際に、本当に一晩ですまたは部屋を見たいと思ってないかもしれません。

特定のストレージエンジンに応じてロック粒度は、InnoDBの行レベルのロックは、テーブルロックをページレベルロックを達成します。

オーバーヘッドロックからそれらの大きなサイズは、同時容量が下降されます。

テーブルデザイン

1.なぜ我々は、主キーを設定してみてください?

主キーにも、ビジネス上の主キーなしでこのテーブル場合は、テーブル全体の保証一意後のデータ行を確保するためのデータベースですが、また、主キーとしての自己成長のID列を追加することを提案しました。主キーを設定し、調査を剪定する際に従うことより迅速かつデータセキュリティの動作範囲ことを確認してください。

2.主キーインクリメントIDまたはUUID?

推奨インクリメントID、UUIDを使用しないでください。

InnoDBストレージエンジンので、主キーインデックスは、主キーインデックスがIDインクリメントされる場合、葉ノードのプライマリキーインデックスおよびすべてのデータ(順序)、プライマリキーインデックスB +格納され、クラスタ化インデックスが存在でありますそれは不確実性の元のサイズとIDの到着のためにUUIDは、データ挿入の多くの原因となるデータの移動、その後、原因がパフォーマンスインサートを減少し、メモリの断片化の多くは、につながるの場合はこれだけ、バック配置缶を維持する必要があります。

要するに、インクリメントの主キーの性能を持ついくつかのケースではデータの量は、良くなります。

「ハイパフォーマンスMySQLの」からの写真:デフォルトのサフィックスは、インクリメントIDを使用するために、行と300ワットの行挿入UUIDベースのキーテスト、テストのパフォーマンス100ワットを使用する_uuid。

主キークラスタ化インデックス、そうでない場合は、主キーについて、InnoDBは一意のキーが存在しない場合、クラスタ化インデックスとして一意のキーを選択し、暗黙のうちに主キーを生成します。

あなたがテーブルの上にPRIMARY KEYを定義する場合、InnoDBはクラスタ化インデックスとして使用します。

あなたがテーブルのPRIMARY KEYを定義しない場合、MySQLは主キーとしてのみ、NOT NULL列を持つ最初のUNIQUEインデックスをピックアップし、InnoDBは、クラスタ化インデックスとして使用します。

3.なぜ要件フィールドがNOT NULLとして定義されていますか?

MySQLは、この公式サイトを導入しました:

NULL列は、その値がNULLであるかどうかrowtoレコードに追加のスペースを必要とします。MyISAMテーブルでは、各NULLは最も近いバイトに切り上げ、1ビットの余分をcolumntakes。

ヌル値は、より多くのバイトを使用し、多くの場合になりますと、プログラム中の期待と矛盾しています。

4.ユーザーのパスワードハッシュを保存したい場合は、フィールドが保管のために使用すべきですか?

暗号ハッシュの固定長ストリング、塩、ユーザID番号と、他の文字はスペースを節約し、検索効率を向上させることができるVARCHARを格納するために代わりに使用されるべきです。

ストレージエンジン関連

1.どのようなMySQLのストレージエンジンをサポートしていますか?

MySQLはほとんどの場合、などInnoDBは、MyISAMテーブル、メモリ、アーカイブ、など、複数のストレージエンジンをサポートし、直接InnoDBエンジンを使用することを選択したMySQLのInnoDBがデフォルトのストレージエンジンで、最も適切です。

  1. InnoDBテーブルとMyISAMの違いは何ですか?
  • InnoDBのサポートのものが、MyISAMテーブルは物事をサポートしていません。
  • InnoDBは、行レベルのロックをサポートし、サポートMyISAMテーブルレベルのロック
  • InnoDBのサポートMVCCが、MyISAMテーブルはサポートしていません
  • サポートInnoDBの外部キー、およびMyISAMテーブルはサポートしていません。
  • InnoDBは、フルテキストインデックス、およびMyISAMのサポートをサポートしていません。

散乱問題

1. MySQLのvarchar型、および差はあるもののchar。

、空間のCHAR(10)、次いでどんなに多くの実際のコンテンツストレージを適用した場合チャーは、固定長フィールドである。フィールドは、10個の文字を占めるVARCHAR占有最大長のちょうどアプリケーションであり、可変長、、ですスペースは、最後の文字は、長いスペースを使用して格納され、実際の長さ1文字です。

効率の検索用語で、チャー> VARCHAR、従って、使用時に、フィールドの長さの値が決定される場合、使用される文字であってもよいし、またはvarcharを使用しようとすべきである。例えば、パスワード記憶するユーザのMD5暗号化が使用チャーであるべきです。

2. VARCHAR(10)とINT(10)の意味は何ですか?

VARCHAR 10は、格納できるデータの最大長は、INTはより少ない10ゼロにのみ10ショーの長さを表し、アプリケーションスペースの長さを表す。すなわち、INT(1)及びINT(10)でありますそれは、デジタルフットプリントサイズは同じであるが、ディスプレイ表示の長さに応じて格納することができます。

3. MySQLのバイナリログいくつかのエントリの形式があります?違いは、それぞれ何ですか?

3つのフォーマット、声明、行および混合があります。

  • 声明モード、文の記録ユニット。各SQLの影響が原因コンテキストがあり、SQLの実装に記録されますでの下で、時間を節約するために、関連情報を保存する必要があるだけでなく、いくつかの使用する機能などステートメント記録をコピーすることはできません。
  • 行レベル、各行の記録部への変更、全て、多くの操作に起因する実質的に書き留めてもよいが、ログの量これにより、あまりにもこのモードのファイル情報を保存し、ライン(例えば、ALTERテーブル)に大きな変化をもたらすことができます大規模な。
  • 行を使用する場合ステートメント記録文と混合した。妥協溶液、通常の動作を使用することはできません。

また、行のレベルでのMySQLの新バージョンでは、テーブル構造が変化した場合、それは進歩的な記録ではなく、文を記録し、いくつかの最適化を行っています。

4.大ページングどのように対処するには?

一般的に決済用の2つの方向から特大ページ。

  • データベースレベル、これは> 20上限年齢1000000,10このクエリこの文の最適化の余地もあるがload1000000データを必要とするテーブルから選択*に似注意の私たちの主な焦点(効果はそれほど大きくはないが)、ありますその後、実質的にすべて廃棄されたのは、もちろん、唯一のid(年齢> 20リミット1000000,10テーブルからIDを選択)ここで、私たちはテーブルから選択*を変更することができ、時間という10遅い。でを取る。百万のこの負荷が、データが、すべてのフィールドをカバーするインデックスを照会するためには、インデックス内にある、速度はすぐになりますので。そして> 1000000リミット10 idは、また、良好な効率であるところID連続で良いならば、我々はまた、テーブルから*選択することができ、最適化そこに多くの可能性がありますが、核となるアイデアは、それがデータの負荷を軽減することで、同じです。
  • そのようなA要求に対する需要を削減する観点から...メインは、同様のニーズが(唯一のページビューまたは所定のルートに従ってページを行くことを許され、数百万のページの後に、特定のページに直接ジャンプするように予測可能ではありませんキャッシュ可能)と悪意を持って攻撃されている漏れや連続したIDを防ぐために。

実際には、主にキャッシュすることにより、コンテンツの予測は、RedisのkVのデータベースにキャッシュとして、予め求めページング大解決し、それが直接戻すことができます。

アリババの「Java開発マニュアル」、大規模なページネーションのための解決策は、まず上記と同様です。

5.最適化されたどのように遅い上?とにかく統計スロークエリ?それを消費するSQL内部ビジネスシステムについてクエリを世話しましたか?

業務システムでは、主キーを使用して、クエリに加えて、他の私はそれがテストライブラリに取っテストします、主に定期的にビジネスを行うにおける運用・保守によってスロークエリ統計は、私たちに、クエリのフィードバックが遅くなります。

スロークエリの最適化は、まず不要なデータ列の負荷ですか?それとも、あまりにも多くのデータ?クエリがインデックスをヒットされていない?遅い理由が何であるかを理解したいですか?

だから、また、これらの三つの方向の最適化のため、

  • まず、負荷の追加データかどうかを確認するためのステートメントは、クエリは、冗長ライン可能と捨て、カラムが文を分析し、書き換える必要はありません結果の多くがロードされることがあります。
  • その文はできるだけインデックスを打つことができるように、実施計画の分析文は、その後、修正文の後に、インデックスを使用して、それを取得したり、インデックスを変更します。
  • 文の最適化が行われていない場合は、テーブル内のデータの量が多すぎると、水平または垂直の部品表もありそうならば検討します。

6.上記横方向と縦方向のパーティションテーブルパーツテーブル、それらは適切な差の例を与えることができますか?

表の行が横方向のパーティションテーブルによって分割されています。私たちはユーザーテーブルがあるとし、主キーのIDがインクリメントされ、データの利用者のID。大量ながら、クエリのテーブルの上に1億人以上、時間があります効果は非常に満足のいくものではない。我々は、主キーのサブテーブルのID、それは尾数で分割されているか否かを、IDやプレスセクションポイントが可能であることができる。100テーブル、各テーブルに終了想定応じ0~99データだけで100ワットである。クエリ効率のこの時点では間違いなく要件を満たしています。

縦方向のパーティションテーブルが列テーブルによって分割され、リストの形でのコンテンツ表示システムが更新され、我々は今、記事の要約ID-フィールドを含むテーブルを持っていることを前提とし-...ときの記事をユーザーがクリックする、リストは、唯一のタイトルと概要が含まれています記事のテキストコンテンツのみ詳細を入力する必要があります。このとき、データが大きい場合、これは素晴らしいものだと、頻繁に使用されていないが、元のクエリの速度はテーブルが遅くなります一緒に記載されています。私たちは、上記の表を2つに分割されていることができます.id-要約、ID-内容。詳細をユーザーがクリックすると、コンテンツを取るために再び主キーという。主キーフィールドのストレージ容量のわずかな増加。小さな価格。

もちろん、実際には、サブテーブルとサブテーブルの前にサービスの関連する高度は、としてよくベンチマークとして研究を行うようにしてください。自分の推測ブラインド操作に従わないでください。

7.ストアドプロシージャとは何ですか?長所と短所は何ですか?

ストアドプロシージャは、SQL文を事前に作成しています。1、理解するのがより簡単:プロセスは、そのような特徴のいくつか(単一のテーブルまたは複数のテーブルを実現する方法として、T-SQLステートメントコードとしてT-SQL文の数でコードブロックで格納されているレコードセットであることができますCRUD)、その後、この機能を使用するときに、ライン上で彼を呼んで、ブロックに名前を付けます。2は、ストアドプロシージャは、コードブロックをプリコンパイルされ、効率が別のストアドプロシージャT_SQL文の数が多い、比較的高い、ネットワークトラフィックが通信速度を向上させることができ、データのセキュリティがある程度確保することができます

しかし、インターネットのプロジェクトでは、実際には、ストアドプロシージャをお勧めしません、ストアドプロシージャの使用を禁止アリさんの「Java開発マニュアル」より有名ですが、私はインターネットのプロジェクト、速いイテレーション、プロジェクトでそれを理解しますライフサイクルは、再利用性が良いので、サービス層には書いていない、より頻繁に、この場合には、ストアドプロシージャの管理が本当にそう簡単ではありません伝統的なモビリティ・プロジェクトに比べて、比較的短いですが、。

3つのパラダイム約8話

最初のパラダイムは:各列は第二のパラダイムを細分化しないかもしれない:非プライマリキー列が完全に主キーに依存して、主キーパラダイムの3番目の部分に依存しない非プライマリ・キー列、主キーにのみ依存し、依存しません他の非プライマリキー。

あなたは準拠していない場合は、3つのパラダイムに従うことをしようとするときに、データベース構造の設計では、このようなパフォーマンスとしては十分な理由、存在しなければならない。データベース設計のため実際には、我々しばしば妥協のパフォーマンス。

#9. MyBatisの

発生頻度が高すぎるために奇妙な質問へのカオスは... ..私は、一人でこの問題を記録したいです。

#内容が文字列として渡されます、違いは何ですか?**混乱の奇妙な質問への.....発生頻度が高すぎるので、私はただ、一人でこの問題を記録したい。#渡します文字列などのコンテンツ、および値は、SQL文のステッチに直接渡されます。

#SQLインジェクション攻撃をある程度防ぐことができるので。

おすすめ

転載: www.cnblogs.com/redBack/p/11833900.html