検索
ホームページデータベースmysql チュートリアルMySQL は OR 条件を使用したインデックス列を回避します



開発前の SQL コードでは、where 条件を含む多くのクエリが更新されていても、この損失を何度も経験しました。ここでは、 または を使用することの欠点とそれを改善する方法を示す例を示します。

select f_crm_id from d_dbname1.t_tbname1 where f_xxx_id = 926067 and (f_mobile ='1234567891' or f_phone ='1234567891' ) limit 1

クエリ ステートメントから、f_mobile フィールドと f_phone フィールドの両方に電話番号が格納されていることが簡単にわかります。一般的な考え方は、SQL を使用するか、SQL を使用して解決することですが、大量のテーブル データは単なる災害です。

MySQL は OR 条件を使用したインデックス列を回避します

t_tbanme1 には idx_id_mobile(f_xxx_id,f_mobile)、idx_phone(f_phone)、idx_id_email(f_id,f_email) というインデックスがありますが、運が良ければ、idx_id_mobile f_xxx_id を使用できる場合もあります

。なぜなら、mysql のすべてのクエリ、テーブル上で選択できるインデックスは 1 つだけだからです。 idx_id_mobile インデックスが使用されており、制限 1 があるためデータが 1 つだけ存在する場合は、すぐに結果が得られますが、f_mobile のデータがない場合は、f_phone フィールドは 1 つずつ検索することしかできません。 f_id 条件、120,000 行のスキャン。 or は and とは異なります。(f_xxx_id,f_mobile,f_phone) を追加すれば完璧だとさえ考えています。

それでは SQL を最適化してはどうでしょうか。それは非常に簡単です (

f_mobile と f_phone に対応するインデックスが必要であることに注意してください)、方法 1:

(select f_crm_id from d_dbname1.t_tbname1 where f_xxx_id = 926067 and f_mobile ='1234567891' limit 1 ) UNION ALL 
(select f_crm_id from d_dbname1.t_tbname1 where f_xxx_id = 926067 and f_phone ='1234567891' limit 1 )

MySQL は OR 条件を使用したインデックス列を回避します

両方の結果セットの場合、2 つの独立した SQL がインデックスを使用でき、別々のクエリに独自の制限があります。返されるものは何でもいいので、1 つだけ受け取ってください。

この種のクエリが特に頻繁に発生する場合 (キャッシュがない場合)、たとえば、数値のほとんどが f_mobile 上にある場合は、それを別の SQL 実行に変更して実行します。最初に sql1 を実行し、結果があれば終了します。 判定 結果がない場合は、sql2 を実行します。これにより、データベース クエリの速度が低下し、コードがより多くのことを処理できるようになります。複雑なシナリオは 1 つのレコードのみを返すだけの単純な制限 2:

sql1 = select f_crm_id from d_dbname1.t_tbname1 where f_xxx_id = 926067 and f_mobile ='1234567891' limit 1;
sq1.execute();
if no result sql1:
  sql1 = select f_crm_id from d_dbname1.t_tbname1 where f_xxx_id = 926067 and f_phone ='1234567891' limit 1;
    sql1.execute();
この場合、f_create_time と f_modify_time の両方が判定条件を満たす可能性があるため、重複したデータが返される可能性があるため、メソッド 1 とメソッド 2 の両方を変更する必要があります。

方法 1 は変更する必要があります:

select a.f_crm_id from d_dbname1.t_tbname1 as a where (a.f_create_time > from_unixtime('1464397527') or a.f_modify_time > from_unixtime('1464397527') ) limit 0,200

UNION ALL を UNION に変更しても重複は解消されないという人もいます。クエリが頻繁に行われる場合、または制限が比較的大きい場合、データベースには依然として負荷がかかるため、トレードオフが必要です。

この場合、指値による注文が必要になる可能性がある状況を含め、方法 2 の方が適しています。変換疑似コード:

(select a.f_crm_id from d_dbname1.t_tbname1 as a where a.f_create_time > from_unixtime('1464397527') limit 0,200 ) UNION ALL
(select a.f_crm_id from d_dbname1.t_tbname1 as a where a.f_modify_time > from_unixtime(&#39;1464397527&#39;)and a.f_create_time <= from_unixtime(&#39;1464397527&#39;) limit 0,200)

またはデータベース上での最適化が難しい条件は、データベースをダウンさせないようにコード内で最適化できます。 or 条件でインデックスが必要ない場合 (比較するデータの量が少ない場合) にのみ考慮されます。

同じフィールド、または f_id=1 または f_id=100 -> f_id in (1,100) のように in に変更できます。 効率の問題については、「mysql の or および in の効率の問題」の記事を参照してください。

上記の最適化シナリオはすべて InnoDB の場合のストレージ エンジンです。MyISAM では異なります。テーブルがいっぱいになるのを回避するためにインデックスを使用できる条件を参照してください。

上記は、インデックス列での OR 条件の使用を避けるための MySQL の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLは、他のRDBMSと比較してどのように同時性を処理しますか?MySQLは、他のRDBMSと比較してどのように同時性を処理しますか?Apr 29, 2025 am 12:44 AM

mysqlhandlesconcurrencyusing amixofrow-levelandtable-levellocking、主にthroughnodb'srow-levellocking.comparedtootherrdbms、mysqlのsapproachiseformanyusecasesecasesbutmayfaceChallengeswithdeadlockdlacklikeRisikErisikErikErikErikErikErikErikErikErikErikErikErikErikErikErikeを使用してください

MySQLは、他のリレーショナルデータベースと比較してトランザクションをどのように処理しますか?MySQLは、他のリレーショナルデータベースと比較してトランザクションをどのように処理しますか?Apr 29, 2025 am 12:37 AM

mysqlhandlestransactionsefectivectivelivationtivelivational supportingingacidpropertiessimilArtopostgreslesclandoracle.1)mysqluseSesrepeatable-readededededededededededefaultisolation level

MySQLで利用可能なデータ型は何ですか?MySQLで利用可能なデータ型は何ですか?Apr 29, 2025 am 12:28 AM

MySQLデータ型は、数値、日付と時刻、文字列、バイナリ、空間型に分割されます。正しいタイプを選択すると、データベースのパフォーマンスとデータストレージを最適化できます。

MySQLで効率的なSQLクエリを作成するためのベストプラクティスは何ですか?MySQLで効率的なSQLクエリを作成するためのベストプラクティスは何ですか?Apr 29, 2025 am 12:24 AM

ベストプラクティスには以下が含まれます。1)データ構造とMySQL処理方法の理解、2)適切なインデックス作成、3)SELECT*、4)適切な結合タイプの使用、5)サブQueriesを使用して、5)慎重に使用します。これらのプラクティスは、MySQLクエリを高速であるだけでなく、保守性、スケーラビリティ、リソース効率もすることができます。

MySQLはPostgreSQLとどのように違いますか?MySQLはPostgreSQLとどのように違いますか?Apr 29, 2025 am 12:23 AM

mysqlisbetterforspeedandsimplicity、適切なforwebapplications; postgresqlexcelsincomplexdatascenararios withobustfeatures.mysqlisidealforquickprojectsandread-havytasks、whilepostgressqlessqlispreredforforivationsRedictrictiontrictdateinitegriTinitegriTiontegriTioniitaintegrategrisioniationegrisioniaty

MySQLはデータレプリケーションをどのように処理しますか?MySQLはデータレプリケーションをどのように処理しますか?Apr 28, 2025 am 12:25 AM

MySQLは、非同期、半同期、およびグループ複製の3つのモードを介してデータの複製を処理します。 1)非同期の複製パフォーマンスは高くなりますが、データが失われる可能性があります。 2)半同期複製により、データセキュリティが向上しますが、遅延が増加します。 3)グループレプリケーションは、高可用性要件に適したマルチマスターレプリケーションとフェールオーバーをサポートします。

説明ステートメントを使用してクエリパフォーマンスを分析するにはどうすればよいですか?説明ステートメントを使用してクエリパフォーマンスを分析するにはどうすればよいですか?Apr 28, 2025 am 12:24 AM

説明ステートメントは、SQLクエリのパフォーマンスを分析および改善するために使用できます。 1.説明ステートメントを実行して、クエリプランを表示します。 2。出力結果を分析し、アクセスの種類、インデックスの使用量に注意し、順序を結合します。 3.分析結果に基づいてインデックスを作成または調整し、結合操作を最適化し、フルテーブルスキャンを回避してクエリ効率を向上させます。

MySQLデータベースをバックアップして復元するにはどうすればよいですか?MySQLデータベースをバックアップして復元するにはどうすればよいですか?Apr 28, 2025 am 12:23 AM

論理バックアップにMySQLDUMPとホットバックアップにMySQLenterPriseBackupを使用することは、MySQLデータベースをバックアップする効果的な方法です。 1. mysqldumpを使用してデータベースをバックアップします:mysqldump-uroot-pmydatabase> mydatabase_backup.sql。 2。ホットバックアップにmysqlenterprisebackupを使用:mysqlbackup - user = root-password = password - backup-dir =/path/to/backupbackup。回復するときは、対応する寿命を使用します

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版

SublimeText3 中国語版

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

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。