ホームページ  >  記事  >  データベース  >  Mysqlデータベースの最適化方法のまとめ(必読)

Mysqlデータベースの最適化方法のまとめ(必読)

不言
不言オリジナル
2018-08-18 17:52:063185ブラウズ

この記事は、Mysql データベースの最適化方法をまとめたものです。必要な方は参考にしていただければ幸いです。

学習には終わりがありません。データベースの最適化はさまざまな側面に分かれています。ここでは、比較的完全な要約を作成し、仕事や勉強をしている同僚と共有しました。

データベースの最適化は、次の 7 つの主要な側面に分かれています:

1. テーブルの設計は、 3 正規形 に準拠する必要があります ( 適切な逆 3 正規形も使用できます)。 );

2. インデックスはクエリの速度に大きな影響を与えます (主キー インデックス、通常のインデックス、フルテキスト インデックス)。プロシージャ、トリガー、トランザクションなど。

4 、読み取りと書き込みの分離 (マスターとスレーブのデータベース)

5. SQL ステートメントの最適化 (クエリの実行速度が遅い)。

テーブルのパーティショニング: 大きなテーブルを複数のテーブルに分割します。 パーティション: テーブルの内容をストレージ用に異なる領域に割り当てます

7. mysql サーバー ハードウェアをアップグレードします。

次に最適化方法を詳しく説明します。

第一正規形と第三正規形

第一正規形:

原子性: リレーショナルデータベースである限り、テーブル内のフィールドはそれ以上分割できません。第一正規形

関係 タイプ データベース

(行と列の概念を含む) : mysql、sql サーバー、oracle、db2、infomix、sybase、postgresql を設計するときは、まずライブラリ -> テーブル -> を用意します。 ;フィールド>特定のレコード (コンテンツ): データを保存する場合、フィールドを設計する必要があります。

非リレーショナル データベース (一般的に nosql データベースと呼ばれます): memcache、redis、momgodb など。

第 2 正規形:

テーブル内に同一のレコードはなく、主キーによって解決できます

第 3 正規形:

冗長なデータは格納できませんテーブル


リバーススリーパラダイムデザイン:

アルバムテーブル

IDAlお尻の名前アルバムビュー数写真100
1 人生
100 2 仕事写真
写真リスト
IDフォトブックID100

アルバムのビューを計算したい場合は、アルバム テーブルにアルバム ビュー フィールドを追加し、写真を参照するときに同時にアルバム ビューを更新できます。

2. スロークエリをオンにする

Mysql のスロークエリはデフォルトでオフになっており、10 秒を超える SQL ステートメントはデフォルトで記録されます。

1. 遅いクエリのレコード時間を確認します:

show variables like ‘long_query_time’;

2. 次の関数を使用してテストします:

set long_query_time=2;

3.

1. 主キーインデックスの特徴:

(1) テーブルには最大 1 つの主キーインデックスが存在します (2) 1 つの主キーインデックスは複数の列を指すことができます

(3)主キーインデックスのカラムは重複値やnullは不可

(4) 主キーインデックスの効率が高い。

2. 一意のインデックスの特徴:

(1) テーブル内に複数の一意のインデックスが存在する可能性があります
(2) 一意のインデックスは複数の列を指すことができます

(3) 一意の場合インデックスでは、not null が指定されていない場合、列が空になる可能性があり、同時に複数の null が存在する可能性があります。

(4) 一意のインデックスの方が効率的です。

3. 通常のインデックス:

通常のインデックスの使用は主にクエリ効率を向上させるためです

4. フルテキスト インデックス

MySQL 独自のフルテキスト インデックス mysql5.5 は中国語をサポートしていません。ただし、必要なテーブルのストレージ エンジンは myisam です。中国語をサポートしたい場合は、(1) aphinx 中国語版 coreseek を使用する (全文インデックスを置き換える)

(2) プラグイン mysqlcft の 2 つのオプションがあります。

インデックス追加時の主な問題:

(1) クエリ条件として頻繁に使用されるフィールドにはインデックスを作成する必要があります。一意性の低いフィールドは、たとえ頻繁にクエリ条件として使用されるとしても、個別のインデックス作成には適していませんクエリ条件、

Update 非常に頻繁なフィールドはインデックスの作成には適していません

(2) WHERE 句に出現しないフィールドにはインデックスを作成しないでください。クエリの速度は向上しますが、 には影響があります。追加と削除の効率化。また、インデックス ファイルがスペースを占有します。

4. サブテーブル、パーティション

垂直サブテーブル (コンテンツメインテーブル + 追加テーブル):

コンテンツメインテーブル: さまざまなデータの一部の公開情報を格納します。 , たとえば、データの名前や追加時刻など、
は複数の追加テーブルを使用でき、追加テーブルにはデータの何らかの固有の情報が保存されます。

主な理由: コンテンツ マスター テーブル内のデータへのアクセスがより頻繁になります。

特徴: 異なるテーブル構造


水平テーブル分割:

テーブルデータを異なるテーブルに保存


特徴: テーブル構造は同じです


パーティション:

は、ディスクの異なる領域にテーブルを格納しますが、それでも 1 つのテーブルです。

基本概念:

(1)範囲 – このモードでは、データをさまざまな範囲に分割できます。たとえば、テーブルを年ごとに複数のパーティションに分割できます。

(2)List (事前定義リスト) – このモードでは、システムが事前定義リストの値によってデータを分割できます。

(3)ハッシュ (ハッシュ) – このモードでは、テーブルの 1 つ以上の列のハッシュ キーを計算でき、最後にこのハッシュ コードのさまざまな値に対応するデータ領域を分割します。たとえば、テーブルの主キーを分割するテーブルを作成できます。

(4)Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

分区表的限制:

(1)只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列。

(2)最大分区数目不能超过1024。

(3)如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内。

(4)按日期进行分区很非常适合,因为很多日期函数可以用。但是对于字符串来说合适的分区函数不太多。

五、并发处理的锁机制

锁机制:在执行时,只有一个用户获得锁,其他用户处于阻塞状态,需要等待解锁。

mysql 的锁有以下几种形式:

表级锁:开销小,加锁快,发生锁冲突的概率最高,并发度最低。myisam引擎属于这种类型。

行级锁:开销大,加锁慢,发生锁冲突的概率最低,并发度也最高。innodb属于这种类型。

表锁的演示:

1.对myisam表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其他进程的操作。

2.表添加读锁后,其他进程对该表只能查询操作,修改时会被阻塞。

3.当前进程,能够执行查询操作,不能执行修改操作。不能对没有锁定的表进行操作。

4.锁表的语法:

lock table 表名 read|write

5.也可以锁定多个表

6.对myisam表的写操作(加写锁),会阻塞其他进程对锁定表的任何操作,不能读写,

7.表加写锁后,则只有当前进程对锁定的表,可以执行任何操作。其他进程的操作会被阻塞。

 行锁的演示:

1.innodb存储引擎是通过给索引上的索引项加锁来实现的,这就意味着:只有通过索引条件检索数据,innodb才会使用行级锁,否则,innodb使用表锁。

2.开启行锁后,当前进程在针对某条记录执行操作时,其他进程不能操作和当前进程相同id的记录。

php里面有文件锁,在实际的项目中多数使用文件锁,因为表锁,会阻塞,当对一些表添加写锁后,其他进程就不能操作了。这样会阻塞整个网站,会拖慢网站的速度。

相关推荐:



写真名
閲覧数 2

以上がMysqlデータベースの最適化方法のまとめ(必読)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。