目次
1. 最も適切なフィールド属性を選択します #MySQL は大量のデータへのアクセスを十分にサポートできますが、一般的に言えば、データベース内のテーブルが小さいほど、テーブル上で実行されるクエリは高速になります。したがって、テーブルを作成するときに、パフォーマンスを向上させるために、テーブル内のフィールドの幅をできるだけ小さく設定できます。
MySQL はバージョン 4.0 以降、ユニオン クエリをサポートしており、一時テーブルを使用して 2 つ以上の選択を行うことができます。クエリは 1 つのクエリに結合されます。クライアントのクエリ セッションが終了すると、データベースが整然と効率的に保たれるように、一時テーブルは自動的に削除されます。 Union を使用してクエリを作成する場合、キーワードとして UNION を使用して複数の select ステートメントを接続するだけで済みますが、すべての select ステートメントのフィールドの数が同じである必要があることに注意してください。次の例は、UNION を使用したクエリを示しています。
5、锁定表
6、使用外键
7、使用索引
8、优化的查询语句
ホームページ データベース mysql チュートリアル mysqlデータベースを最適化する方法

mysqlデータベースを最適化する方法

Jun 01, 2019 pm 01:30 PM
mysqlの最適化

mysqlデータベースを最適化する方法

#MySQL データベースを最適化する 8 つの方法:

1. 最も適切なフィールド属性を選択します #MySQL は大量のデータへのアクセスを十分にサポートできますが、一般的に言えば、データベース内のテーブルが小さいほど、テーブル上で実行されるクエリは高速になります。したがって、テーブルを作成するときに、パフォーマンスを向上させるために、テーブル内のフィールドの幅をできるだけ小さく設定できます。

たとえば、郵便番号フィールドを定義するときに、それを CHAR(255) に設定すると、明らかにデータベースに不必要な領域が追加されます。CHAR(6 ) で完全に完了できるため、VARCHAR を使用しても冗長です。タスクは非常にうまくいきます。同様に、可能であれば、整数フィールドを定義するには BIGIN の代わりに MEDIUMINT を使用する必要があります。

効率を向上させるもう 1 つの方法は、可能であればフィールドを NOTNULL

に設定して、今後クエリを実行するときにデータベースが NULL 値を比較する必要がないようにすることです。 「都道府県」や「性別」などの一部のテキストフィールドについては、ENUM タイプとして定義できます。 MySQL では ENUM 型は数値データとして扱われ、数値データはテキスト型よりもはるかに高速に処理されるためです。このようにして、データベースのパフォーマンスを向上させることができます。

2. サブクエリ (サブクエリ) の代わりに結合 (JOIN) を使用します。

MySQL は 4.1 以降、SQL サブクエリをサポートします。この手法を使用すると、SELECT ステートメントを使用してクエリ結果の単一列を作成し、この結果を別のクエリのフィルター条件として使用できます。例えば、基本顧客情報テーブルにある注文のない顧客を削除したい場合、サブクエリを使用して、まず売上情報テーブルから注文を行ったすべての顧客のIDを取得し、その結果を次のテーブルに渡すことができます。以下に示すメイン クエリ:

DELETE    FROM    customerinfo
WHERE    CustomerID    NOT IN (SELECT    CustomerID    FROM    salesinfo)
ログイン後にコピー

サブクエリを使用すると、論理的に複数のステップを一度に完了する必要がある多くの SQL 操作を完了できます。また、トランザクションやテーブルのロックも回避でき、記述も簡単です。ただし、サブクエリをより効率的な結合 (JOIN) に置き換えることができる状況もあります。たとえば、注文レコードを持たないすべてのユーザーを取得したいとします。次のクエリを使用してそれを完了できます:

SELECT * FROM customerinfo
WHERE CustomerID NOT IN (SELECTC    ustomerID    FROM    salesinfo)
ログイン後にコピー

接続 (JOIN) を使用する場合... を完了するにはこのクエリでは、

の方が速度が速くなります。特に salesinfo テーブルに CustomerID のインデックスがある場合、パフォーマンスが向上します。クエリは次のとおりです:

SELECT    *    FROM    customerinfo
LEFT    JOIN    salesinfo    ON    customerinfo.CustomerID=salesinfo.CustomerID
WHERE    salesinfo.CustomerID    ISNULL
ログイン後にコピー
Connection (JOIN).. より効率的である理由は、MySQL がこの論理クエリを完了するための一時テーブルを作成するには、2 つの手順が必要です。

3. ユニオン (UNION) を使用して手動で作成した一時テーブルを置き換える

MySQL はバージョン 4.0 以降、ユニオン クエリをサポートしており、一時テーブルを使用して 2 つ以上の選択を行うことができます。クエリは 1 つのクエリに結合されます。クライアントのクエリ セッションが終了すると、データベースが整然と効率的に保たれるように、一時テーブルは自動的に削除されます。 Union を使用してクエリを作成する場合、キーワードとして UNION を使用して複数の select ステートメントを接続するだけで済みますが、すべての select ステートメントのフィールドの数が同じである必要があることに注意してください。次の例は、UNION を使用したクエリを示しています。

SELECT    Name,Phone    FROM    client    UNION
SELECT    Name,BirthDate    FROM    author    UNION
SELECT    Name,Supplier    FROM    product
ログイン後にコピー

4. トランザクション

サブクエリ (Sub-Queries)、接続 (JOIN)、ユニオン (UNION) を使用してさまざまなクエリを作成できますが、ただし、すべてのデータベース操作が 1 つまたはいくつかの SQL ステートメントだけで完了できるわけではありません。特定の種類の作業を完了するには、一連のステートメントが必要になることがよくあります。ただし、この場合、このステートメント ブロック内の特定のステートメントが誤って実行されると、ステートメント ブロック全体の動作が不確実になります。特定のデータを 2 つの関連テーブルに同時に挿入したいとします。最初のテーブルが正常に更新された後、データベースで予期しない状況が発生し、2 番目のテーブルの操作が完了しないことが起こります。このようにして、データは不完全になり、データベース内のデータさえも破壊されます。この状況を回避するには、トランザクションを使用する必要があります。その機能は、ステートメント ブロック内のすべてのステートメントが成功するか失敗するかのいずれかです。つまり、データベース内のデータの一貫性と完全性を維持できます。物事は BEGIN キーワードで始まり COMMIT キーワードで終わります。この期間中に SQL 操作が失敗した場合、ROLLBACK コマンドによってデータベースを BEGIN が開始される前の状態に復元できます。

BEGIN; INSERT    INTO    salesinfo    SET    CustomerID=14; UPDATE    inventory    SET    Quantity=11    WHERE    item='book'; COMMIT;
ログイン後にコピー

トランザクションのもう 1 つの重要な役割は、複数のユーザーが同じデータ ソースを同時に使用するときに、データベースをロックする方法を使用して、ユーザーに安全なアクセス方法を提供し、ユーザーの安全性を確保できることです。他のユーザーの邪魔にならないようにしてください。

5、锁定表

尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。

其实,有些情况下我们可以通过锁定表的方法来获得更好的性能。下面的例子就用锁定表的方法来完成前面一个例子中事务的功能。

LOCK    TABLE    inventory    WRITE    SELECT    Quantity    FROM    inventory    WHERE    Item='book';
...
UPDATE    inventory    SET    Quantity=11    WHERE    Item='book'; UNLOCKTABLES
ログイン後にコピー

这里,我们用一个select语句取出初始数据,通过一些计算,用update语句将新值更新到表中。包含有WRITE关键字的LOCKTABLE语句可以保证在UNLOCKTABLES命令被执行之前,不会有其它的访问来对inventory进行插入、更新或者删除的操作。

6、使用外键

锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。

例如,外键可以保证每一条销售记录都指向某一个存在的客户。在这里,外键可以把customerinfo表中的CustomerID映射到salesinfo表中CustomerID,任何一条没有合法CustomerID的记录都不会被更新或插入到salesinfo中。

CREATE    TABLE    customerinfo( CustomerIDINT    NOT    NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;

CREATE    TABLE    salesinfo( SalesIDNT    NOT    NULL,CustomerIDINT    NOT    NULL,

PRIMARYKEY(CustomerID,SalesID),

FOREIGNKEY(CustomerID)    REFERENCES    customerinfo(CustomerID)    ON    DELETE    CASCADE)TYPE=INNODB;
ログイン後にコピー

注意例子中的参数“ON DELETE CASCADE”。该参数保证当customerinfo表中的一条客户记录被删除的时候,salesinfo表中所有与该客户相关的记录也会被自动删除。如果要在MySQL中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表InnoDB类型。该类型不是MySQL表的默认类型。定义的方法是在CREATETABLE语句中加上TYPE=INNODB。如例中所示。

7、使用索引

索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。

那该对哪些字段建立索引呢?

一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况

例如customerinfo中的“province”..字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引,也可以使用ALTERTABLE或CREATEINDEX在以后创建索引。此外,MySQL从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL中是一个FULLTEXT类型索引,但仅能用于MyISAM类型的表。对于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX创建索引,将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中,执行过程将会非常慢。

8、优化的查询语句

绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

下面是应该注意的几个方面。

  • 首先,最好是在相同类型的字段间进行比较的操作。

    在MySQL3.23版之前,这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较;但是作为特殊的情况,在CHAR类型的字段和VARCHAR类型字段的字段大小相同的时候,可以将它们进行比较。

  • 其次,在建有索引的字段上尽量不要使用函数进行操作。

例如,在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。

  • 第三,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。

例如下面的查询将会比较表中的每一条记录。

SELECT    *    FROM    books

WHERE    name    like"MySQL%"
ログイン後にコピー

但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:

SELECT    *    FROM    books

WHERE    name>="MySQL"    andname    <"MySQM"
ログイン後にコピー

最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL を通じて AVG 機能を最適化してパフォーマンスを向上させる方法 MySQL を通じて AVG 機能を最適化してパフォーマンスを向上させる方法 May 11, 2023 am 08:00 AM

MySQL の AVG 関数を最適化してパフォーマンスを向上させる方法 MySQL は、多くの強力な機能を備えた人気のあるリレーショナル データベース管理システムです。 AVG 関数は平均値の計算に広く使用されていますが、この関数はデータ セット全体を走査する必要があるため、大規模なデータの場合にはパフォーマンスの問題が発生します。この記事では、MySQL を通じて AVG 機能を最適化し、パフォーマンスを向上させる方法を詳しく紹介します。 1. インデックスの使用 インデックスは MySQL 最適化の最も重要な部分です。

TokiDB エンジンに基づいた MySQL の最適化: 書き込みと圧縮のパフォーマンスを向上 TokiDB エンジンに基づいた MySQL の最適化: 書き込みと圧縮のパフォーマンスを向上 Jul 25, 2023 pm 11:45 PM

TokiDB エンジンに基づく MySQL の最適化: 書き込みと圧縮のパフォーマンスの向上 はじめに: 一般的に使用されるリレーショナル データベース管理システムとして、MySQL は、ビッグ データ時代の文脈において、書き込み圧力とストレージ要件の増大に直面しています。この課題に対処するために、TokuDB エンジンが誕生しました。この記事では、TokuDB エンジンを使用して MySQL の書き込みパフォーマンスと圧縮パフォーマンスを向上させる方法を紹介します。 1.TokuDBエンジンとは何ですか? TokiDB エンジンは、大量の書き込みを処理するように設計されたビッグデータ指向のエンジンです。

MySQL の低レベルの最適化を実現する方法: SQL ステートメントの高度な最適化のためのヒントとベスト プラクティス MySQL の低レベルの最適化を実現する方法: SQL ステートメントの高度な最適化のためのヒントとベスト プラクティス Nov 08, 2023 pm 04:32 PM

MySQL は、Web アプリケーションの開発とデータ ストレージによく使用される、広く使用されているリレーショナル データベース管理システムです。実際のアプリケーションでは、MySQL の基盤となる最適化が特に重要であり、その中でも SQL ステートメントの高度な最適化がデータベースのパフォーマンスを向上させる鍵となります。この記事では、MySQL の基礎となる最適化を実装するためのヒントとベスト プラクティス、および具体的なコード例を紹介します。クエリ条件を決定する SQL ステートメントを作成するときは、まずクエリ条件を明確に定義し、ワイルドカード クエリを無制限に使用しないようにする必要があります。つまり、クエリを開くために "%" を使用しないようにします。

電子商取引アプリケーションにおける MySQL の最適化とセキュリティ プロジェクトの経験の分析 電子商取引アプリケーションにおける MySQL の最適化とセキュリティ プロジェクトの経験の分析 Nov 03, 2023 am 10:42 AM

MySQL は、電子商取引の分野で広く使用されているリレーショナル データベース管理システムです。電子商取引アプリケーションでは、MySQL を最適化して保護することが重要です。この記事では、電子商取引アプリケーションにおける MySQL の最適化とセキュリティ プロジェクトの経験を分析します。 1. パフォーマンスの最適化データベース アーキテクチャ設計: 電子商取引アプリケーションでは、データベース設計が鍵となります。合理的なテーブル構造設計とインデックス設計により、データベースのクエリ パフォーマンスを向上させることができます。同時に、テーブル分割およびパーティション化テクノロジを使用すると、単一テーブル内のデータ量が削減され、クエリ効率が向上します。

MySQL 接続数管理を最適化する方法 MySQL 接続数管理を最適化する方法 Mar 16, 2024 am 08:12 AM

MySQL の接続数管理を最適化する方法 MySQL は、さまざまな Web サイトやアプリケーションで広く使用されている人気のあるリレーショナル データベース管理システムです。実際のアプリケーションプロセスでは、MySQL の接続数の管理は非常に重要な問題であり、特に同時実行性が高い状況では、接続数を合理的に管理することでシステムのパフォーマンスと安定性を向上させることができます。この記事では、MySQL の接続数管理を最適化する方法を詳細なコード例を含めて紹介します。 1. 接続数管理を理解する MySQL では、接続数とはシステムが同時に接続できる接続の数を指します。

MySQL の基盤となる最適化を実装する方法: SQL ステートメント最適化の一般的な手法と原則 MySQL の基盤となる最適化を実装する方法: SQL ステートメント最適化の一般的な手法と原則 Nov 08, 2023 pm 08:19 PM

MySQL データベースは一般的なリレーショナル データベースですが、データベース内のデータ量が増加し、クエリ要件が変化するにつれて、基盤となる最適化が特に重要になります。 MySQL の基盤となる最適化のプロセスにおいて、SQL ステートメントの最適化は重要なタスクです。この記事では、SQL ステートメントの最適化に関する一般的な手法と原則について説明し、具体的なコード例を示します。まず、SQL ステートメントの最適化では、インデックスの最適化、クエリ ステートメントの最適化、ストアド プロシージャとトリガーの最適化などの側面を考慮する必要があります。これらの側面では、

MySQL の一般的な問題に対する解決策の完全なコレクション MySQL の一般的な問題に対する解決策の完全なコレクション Jun 15, 2023 am 09:51 AM

MySQL は、大量のデータを保存および管理するために広く使用されているオープンソース データベース管理システムです。ただし、MySQL を使用すると、単純な構文エラーからより複雑なパフォーマンスの問題や不具合まで、さまざまな問題が発生する可能性があります。この記事では、MySQL の最も一般的な問題と解決策のいくつかを検討します。接続の問題 接続の問題はよくあります。 MySQL サーバーに接続できない場合は、以下の点を確認してください。 1) MySQL サーバーが起動しているかどうか 2) ネットワーク接続が正常かどうか 3) MySQ

MySQL の二重書き込みバッファリング テクノロジを適切に構成および最適化する方法 MySQL の二重書き込みバッファリング テクノロジを適切に構成および最適化する方法 Jul 25, 2023 pm 01:01 PM

MySQL の二重書き込みバッファリング テクノロジを適切に構成および最適化する方法 はじめに: MySQL の二重書き込みバッファリング テクノロジは、データのセキュリティとパフォーマンスを向上させる重要なテクノロジです。この記事では、MySQL の二重書き込みバッファリング テクノロジを適切に構成および最適化し、データをより適切に保護し、データベースのパフォーマンスを向上させる方法を紹介します。 1. 二重書き込みバッファリング テクノロジとは何ですか? 二重書き込みバッファリング テクノロジは、MySQL の I/O 最適化テクノロジであり、ディスク I/O 操作の数を大幅に削減し、データベースの書き込みパフォーマンスを向上させることができます。 MySQL が書き込み操作を実行するとき、最初に

See all articles