MySQLのパフォーマンスチューニング声明



MySQLの概要
1.データベース設計パラダイム3
2のサブテーブルのデータベースや倉庫---会員システム()スプリットホライズン(どのようにクエリページネーションへ)MyChar、垂直
3.どのようにスロークエリを配置
------------ ---------
最適化されたインデックスデータベース、インデックス原則
SQL文のチューニング用
データベースの別々の読み取りと書き込み--MyChar
---------------------
パケットました
ストアドプロシージャ、トリガ、関数、
ストアドプロシージャは:SQL文の作品を書き、同様のJavaメソッド、ちょうどコールパスパラメータの欠点:SQL文が変更に柔軟ではない、死んで書かれています。
mysqlの(無料、オープンソース)のOracle(有料)
MySQLのページネーションの限界。オラクル:ROWNUM擬似列


MySQLの最適化
1.合理的に設計するデータベース(3F)
2.追加指数(通常のインデックス、主キーインデックス、ユニークインデックス、フルテキストインデックス)基礎となる:B-ツリーとB +ツリーアルゴリズムと同じバイナリツリーを、スキャンテーブル全体を減らすために
3分表ライブラリー技術部門(モジュロサブテーブル、水平分割、垂直分割)
4.別読み出し及び書き込み
5ストアドプロシージャ
の接続6を構成するMySQLの最大数のmy.ini
7.mysqlアップグレードサーバ
任意フラグメンテーション最大8クリーン
9.sql文チューニングコア


三のフォームデータベース
データベース設計
(冗長性の量、3F還元)データ設計であるもの
3個のどのデータベースパラダイム
1F原子各列の制約を表すが分割できない
   述べid名セックス・アドレス上に
  1 0 zhangsan北京

  かどうかは保証原子(ビジネスを参照してください)

図2Fは、ユニークな、プライマリ・キーを保証
   orderNum(一意の)名前セックス・アドレスIDを
  1 0 123 zhangsan北京
  順序番号として使用IDにするかどうか、Ordersテーブル?これは許可されていません。
  プロジェクト内のほとんどの長距離電話が外部の外観への通信のためのRPC IDを使用すること、であるorderNumは、システムのセキュリティを確保するために、です。
 
  同時実行生成された注文番号解決するための分散システム
  グラブ票への保証、注文番号の生成は繰り返しませんどのように?注文の冪等を確保する方法(冪等が繰り返されていませんか)?
  アドバンス注文番号世代番号、Redisの、フェッチするresisに直接移動する必要がある。分散ロックは、

図3Fは、冗長データCLASSIDクラス名繰り返しを持っていない、このテーブルは、CLASSIDを保つことができる
   上述のID名セックスアドレスCLASSIDクラス名の上に
  1 0 zhangsan北京、群
  2リシ0北京2番目のクラス
  2 wangwu 0北京1クラス

  :新しいテーブルから
 CLASSID classNameの
 1クラス
 2番目のクラスの
 
 注:最初の3Fに従うことを完全ではないかもしれません。


MySQLのサブライブラリーサブテーブル
際のサブライブラリー:
    プロジェクト分割されます電力供給プロジェクト、複数の小さなプロジェクトに分割、小規模なプロジェクトはそれぞれ独自の独立したデータベースを持って、互いに独立。-縦に分割します。
  会員データベース、注文データベース、支払いデータベース

場合サブテーブル:
    セグメンテーションのレベル、サブテーブルのルール、ビジネスニーズに応じ。イヤーログ格納テーブル、携帯電話番号136 135 135に従って最初の三つのサブテーブル
  スプリット(モジュロ演算)レベル

  ユーザテーブルは3つのテーブルに分割されている 
  ID名アドレス
  。1張北京
  2ドウ北京
  3 Wangwu北京
  4趙6北京
  5暁北京
  6北京赤

  どのように三つの異なるテーブルに保存されている6つのデータに、どのように非常に均一な?モジュロ算術
  表:のUser0 USER1 USER2  
  最初のデータ:1%3 = 1、表プットUSER1。  
  第二のデータ:2%3 = 2、放電テーブルUSER2。   
  第三データ:3%3 = 0、のUser0テーブルをみましょう。等々

  サブテーブルを達成するためにモジュロ演算:3つのテーブルIDが自動的に過去を割り当てるために、専門の記憶表のuserIdの必要性がある、成長することはできません。


レベル分割アルゴリズムタッチケースが取る
利点を:非常に均一な分布
を見るためにチェックする方法を?6表6%3 = 0のUser0のテーブルを見つけるたIDの検索

デモ:

表UUID(作成
 unsinged主キーAUTO_INCREMENT INT ID、
エンジン= MyISAMテーブル文字セットUTF8を、

@Service
パブリッククラスUserServiceの{
 
 @Autowired
 、プライベートJdbcTemplate jdbcTemplateを

  / **
  *生成するユーザ情報
  * /
 パブリック文字Regit(文字列名、文字列のPWD){
  。。// 1がユーザID生成
  列insertUuidSql = "INSERT INTO UUID値(null)を";
  //直接使用本明細書に一般的に主キーIDをしない返します次のクエリ
    jdbcTemplate.update(insertUuidSql);
  // SELECT LAST_INSERT_ID()は、最も近い平均の主キーID表す
    ロングjdbcTemplate.queryForObjectはuserId =( "SELECT LAST_INSERT_ID()"、requiredType、Long.class)を、
  2 //ストア詳述されるテーブル
  。文字列tableNameの= "ユーザー" +はuserId%3;
  // 3は、特定のテーブルに挿入された
  文字列insertUserSql = "INSERT INTO" + tableNameの+ "値(" +はuserId + "" + userNameに+ "" + PWD + ")" ;
  System.out.printlnは(insertUserSql);
  jdbcTemplate.update(insertUserSql);
  リターン」成功";
 }

 / **
  *根据ID查询
  * /
 パブリック文字列GET(ロングUSERID){
  // 1存放具体哪张表中。
  文字列tableNameの= "ユーザー" +はuserId%3。
  "ID = "+はuserId + tableNameの+"から選択名"列selectUserSql =。
  文字列名= jdbcTemplate.queryForObject(selectUserSql、String.class)。
  名前を返します。
 }
}

@RestController
パブリッククラスUserControllerで{

 @Autowired
 プライベートUserServiceのUserServiceの。

 ( "/ regit")@RequestMapping
 パブリック文字列regit(文字列名、文字列のPWD){
   リターンuserService.regit(名前、PWD)。
 }

 ( "/ getUserメソッド")@RequestMapping
 公共の文字列のget(ロングUSERID){
   リターンuserService.get(USERID)。
 }
}

@SpringBootApplication
パブリッククラスアプリ{
 パブリック静的無効メイン(文字列[] args){
     SpringApplication.run(App.class、引数)。
  }
}

表の後に不利益分は何ですか?
1.ページングクエリ方法
2クエリが非常に制限され、3つのテーブルをチェックする雄性チェックのような
3モジュロ演算テーブルが変更された場合、テーブルは、再分割、RDSアリクラウドデータベースの使用を中断することが

まず、すべてのデータテーブルを格納するためのメインテーブルは、ビジネスニーズに応じて分割されます。


遅いクエリを見つける方法

スロークエリとは何ですか?
1秒に設定されている本番環境では、通常、無応答バックが遅いクエリではありませんがあればMySQLのスロークエリのデフォルトは10秒、10秒です

スロークエリログ保存があります
ショーstatusコマンド

遅いクエリを変更する方法
-スロークエリ照会
;「Slow_queries」のようなステータス表示を
スロークエリクエリ時間-
;「long_query_time」のようなショー変数
スロー修正クエリ時間-
セットlong_query_time = 1;遅い修正クエリ時間は1秒で表し

スロークエリログ検索する方法
デフォルトでは、MySQLが遅いクエリを記録していない、我々はレコードの遅いクエリができる指定された時にMySQLを起動する必要があります。

プロファイル編集は、以下を追加しな/etc/my.cnf
[mysqldを]
slow_query_log ON =
slow_query_log_file = /var/lib/mysql/test-10-226-slow.log
long_query_time。1 =

コンフィギュレーションの再起動のMySQL変更した後
systemctl再起動mysqldの
P - MySQLの-urootを


MySQLのインデックスの概要

なぜインデックス?クエリのパフォーマンスを向上させる
バイナリ検索の原則を達成するために、インデックス-クエリ効率指標を向上させることができますなぜ

インデックス分類:
プライマリ・キー・インデックス-主キーの
主キーのインデックスモードを追加するには:
1.追加する時間のテーブルを作成します。unsinged主キーAUTO_INCREMENT、int型上記のIDの上
2.テーブルを作成するときに追加されていない場合:警告テーブル表には主キー(列名)を追加;

ドロッププライマリインデックス:警告テーブルのテーブル名は主キーをドロップします。

C:\はProgramData \のMySQL \ MySQLサーバ5.6 \データ\テスト下:

* .frmファイルのテーブル構造
* .MYDデータ構造ファイル
* .MYIインデックスファイル

唯一のインデックス
複合インデックス
のフルテキストインデックス
の一般的な指標


原則として基礎となる索引

バイナリサーチと呼ばれる基礎となるバイナリ検索を使用したB-treeインデックス

全表スキャンを削減するためのインデックス - 全表スキャンにはインデックスではありません

第一世代のB-treeインデックスインデックスファイル

インデックス短所は何ですか?、追加、削除インデックスファイルを更新する必要があります


一般的なインデックスとユニークインデックス

ユニークインデックス:キーUNIQUEは、
テーブルのテーブル名(作成
 主キーAUTO_INCREMENT、//プライマリキーのインデックスint型ID
 、一意の名前のVARCHAR(32); //一意のインデックスを

注:独自のフィールドはnullにすることができ、かつヌルを複数有していてもよいが、具体的な内容がある場合は、繰り返すことはできません。
非常に少ないユニークインデックスでは、代わりに主キーインデックスの。


共通のインデックス:
テーブルのテーブル名(作成
 ID unsigned int型、
 名前VARCHAR(32)

定期的な索引作成:テーブルにレコード生成索引指標名(カラム1、カラム2)。

AAAのレコード生成インデックスindex_aaa(名);

-そこにインデックスがまったく実装平面図ではありません
名前= AAA SELECT * FROMを説明する 「zhangsan」は、
インデックスを使用するために、参照型をチェックし、すべてがフルテーブルスキャンしている表し

フルテキストインデックス:

作成しAAA表(
 上記のid int型以上の主キー、
 タイトルVARCHAR(200)、
 本文、
 FULLTEXT(タイトル、本文は)//フルテキストインデックスを作成する
)エンジン= InnoDBは、


ファジィクエリ:ボディ「%張%」のようなAAAから選択*;間違った使い方、インデックスが有効になりません。

インデックスがいるかどうか確認するために実行計画を使用します。
WHERE「張%%」のようなAAA体からSELECT *をEXPLAIN。

使用インデックスクエリ:AAAから(「写真」)との試合(タイトル、本文)*を選択

:インデックスがいるかどうか確認するために実行計画を使用して
、AAA試合から*(「写真」)に対するWHERE(タイトル、本文)を選択しEXPLAIN

使用する場合は、フルテキストインデックス:
しないような
テーブルのフルテキストインデックスは、ビジネス慣行を採用しています。全文は非常に大きな欠点のインデックスを作成、InnoDBはでフルテキストインデックス(データベースのストレージエンジン)をサポートしていません。

 
SQL文の最適化の概要

インデックスの長所と短所:
長所:プログラムの効率向上の
欠点を:addは、削除遅い、インデックスファイルには、メモリを追加し、更新する必要があります

どのようなフィールドがインデックスさに合いますか?
クエリは、より多くの、非常に多くの異なる値があります。

:シーンのインデックス作成
インデックスを作成する場合、条件がクエリを必要とし、値が非常に異なっているところ。唯一のいくつかの値(性別:0,1)は、インデックスを必要としません。


メモインデックス、SQLチューニングパーツ:


-主キーのインデックス作成
、主キー(カラム名)を追加アラートtalbeテーブルと、
-複合インデックスファイルを作成するために、
アラートテーブルテーブル追加インデックスmy_ind(列1、列2)。

注:
1.マルチカラム・インデックスの場合は、あなたが最初の部分を使用しない場合、それはインデックスを作成しません、作成しました。
インデックスを使用- 、テーブルからカラム1 =「AAA」を選択*を説明する
表の列2 =「BBB」SELECT * FROMを説明する; -フルテーブルスキャンを使用すること

2.インデックスを使用するので、全表スキャンは、同様に使用して、%で始まらないだろう、「%%」のように使用していない
ようなコラム1は「%AAA%」どこのテーブルからSELECT *を説明; - 使用して全表スキャンを
説明'AAA%'のようなテーブルの列1 SELECT * FROM; -インデックスを使用

3.または、一つの条件が索引付けされていない限り、完全なテーブルが存在することになるような条件は、索引付けされなければならないスキャン
テーブルからカラム1 =「AAA」または列3 =「CCC」*を選択し説明; -インデックスを使用

4判定するNULLかどうかを、使用することは、ヌル= NOT NULLである
インデックスを使用してパケット群が使用されない5、フルテーブルスキャンであろう。
2列目でテーブル群から選択*説明;
6.高効率パケットは、ソート(デフォルトパケット順序)を禁止する必要が
受注2により、カラムはnullでテーブル群から選択*説明;
7. AAA SELECT * WHEREのuserId> = 100からそして、のuserId> 100高効率AAA SELECT * FROM
以上を使用していないが、2回のフルテーブルスキャンを決定します

8.で、インデックスは、インデックスを使用しませんnotin追加し、間に使用することはできません
、クエリが非常に大きい場合には、9キャッシュポイントテーブルの使用を、ページネーション。


MySQLのストレージエンジンの違い

MySQLのストレージエンジン:InnoDBは/ MyISAMテーブル/メモリ

主流の:InnoDBのサポート取引メカニズム

InnoDBは異なりは、MyISAMテーブル:
バルク--myisam高効率を追加
innodb--非常に安全なトランザクションメカニズム

ロック機構:
MyISAMテーブルロックが
行ロックのInnoDBは、テーブル全体には影響しません

データ構造:
MyISAMテーブルは、フルテキスト検索データベースは、一般的に自身のない操作を行い、フルテキスト検索をサポートしています。

サポートBツリーデータ構造

インデックスのキャッシュをサポート。

MyISAMの注意事項

MyISAMエンジンのテーブル構造を作成する:
表CCC(ID int型、名前VARCHAR(32))ENGINE = MyISAMテーブルを作成し、
データを追加します。
INSERT INTO CCC値(1、 'A');
INSERT INTO CCC値(2、 'B')を、
INTO CCCはINSERT値(3、 'B');
INSERT INTO SELECT CCC ID、CCCから名前。

IDは3、すべてのデータを削除するには
、ID = 3 CCCから削除します。

あなたは見つける:ccc.MYDファイルのサイズが変更されていない、短所を:本当の来削除した後、非常に迅速に回収することができません削除

私は実際に使用削除する:最適化テーブルCCCを、告げたのMyISAMは、整理断片化の明確な。
ビジネス慣行は、物理的に削除データではありません。データの移行。


公開された43元の記事 ウォン称賛32 ビュー40000 +

おすすめ

転載: blog.csdn.net/yz2015/article/details/79601688