ホームページ  >  記事  >  データベース  >  MySQL の制限にはパフォーマンスの問題があることをご存知ですか?

MySQL の制限にはパフォーマンスの問題があることをご存知ですか?

步履不停
步履不停オリジナル
2019-06-19 14:51:352385ブラウズ

MySQL の制限にはパフォーマンスの問題があることをご存知ですか?

MySQL のページング クエリは通常、limit を通じて実装されます。

MySQL の limit基本的な使用法は非常に簡単です。 limit1 または 2 つの整数パラメータを受け取ります。パラメータが 2 つある場合、最初のパラメータは最初に返されるレコード行のオフセットを指定し、2 番目のパラメータは返されるレコード行の最大数を指定します。最初のレコード行のオフセットは 0 です。

PostgreSQL との互換性のために、limitlimit # offset # もサポートします。

問題:

オフセットが小さい場合、limitを直接使用してクエリを実行しても問題ありませんが、データ量が増加すると、ページが後ろに進むほど、limit ステートメントのオフセットが大きくなり、速度が大幅に遅くなります。

#最適化のアイデア:

データ量が多い場合は、あまりにも多くのレコードをスキャンしないでください

#解決策 :

サブクエリ ページング メソッドまたは JOIN ページング メソッド。

JOIN ページングとサブクエリ ページングの効率は基本的に同じレベルであり、消費される時間も基本的に同じです。

これが例です。通常、MySQL の主キーは自動インクリメントする数値型ですが、この場合は以下の方法で最適化できます。

実際の運用環境で 800,000 個のデータを含むテーブルを例として、最適化の前後でクエリ時間を比較します。

 -- 传统limit,文件扫描 [SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2; 受影响的行: 0 时间: 5.371s -- 子查询方式,索引扫描 [SQL] SELECT * FROM tableName WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1) LIMIT 2; 受影响的行: 0 时间: 0.274s -- JOIN分页方式 [SQL] SELECT * FROM tableName AS t1 JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2; 受影响的行: 0 时间: 0.278s
パフォーマンスが 20 近く向上していることがわかります。最適化後の%。

最適化原理:

サブクエリはインデックス上で完了しますが、通常のクエリはデータ ファイル上で完了します。一般に、インデックス ファイルはデータ ファイルよりも大きくなります。はるかに小さいため、操作がより効率的になります。すべてのフィールドの内容を取得するには、最初の方法は多数のデータ ブロックにまたがってそれらを取得する必要があるのに対し、2 番目の方法は基本的に、対応する内容を取得する前にインデックス フィールドに従って直接

位置を特定するためです。当然効率も大幅に向上します。 したがって、

limit

の最適化は、limit を直接使用するのではなく、最初にオフセット ID を取得し、次に limit を直接使用することです。データを取得するためのサイズ。 実際のプロジェクト運用では、ストラテジモードと同様の方法でページングを行うことができ、例えば1ページあたり100個のデータがある場合、100ページ以内と判断した場合は、最も基本的なページング方法。100 を超える場合は、サブクエリ ページネーション方法を使用します。

MySQL 関連の技術記事の詳細については、

MySQL チュートリアル 列にアクセスして学習してください。

以上がMySQL の制限にはパフォーマンスの問題があることをご存知ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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