MYSQL がテーブル全体のスキャンを回避する方法: 1. where および order by に関係する列にインデックスを作成します; 2. where 句のフィールドでの null 値判定を回避し、「!=」または「」の使用を回避します。演算記号、条件を接続するために or を使用しないでください。3. を使用する場合と使用しない場合は注意してください。4. インデックス列での計算の使用は避けてください。
MYSQL はテーブル全体のスキャンを回避します
1. クエリを最適化するには、テーブル全体のスキャンを回避するようにしてください。 where に関係する列にインデックスを構築し、
2 で順序付けすることを検討する必要があります。where 句のフィールドでの null 値の判定を避けるようにしてください。そうしないと、エンジンがインデックスの使用を断念し、完全な処理を実行します。 table scan
例: select id from t where num is null。num にデフォルト値 0 を設定し、テーブルの num 列に null 値がないことを確認してから、次のようにクエリを実行します。 : select id from t where num=0
3. where 句での使用は避けてください。 = または演算子。それ以外の場合、エンジンはインデックスの使用を断念し、テーブル全体のスキャンを実行します。
4. 条件を接続するために where 句で または を使用することは避けてください。そうしないと、エンジンはインデックスの使用を断念し、テーブル全体のスキャンを実行します (ユニオンを使用できます)
5。 in と Not in も注意して使用する必要があり、そうしないとテーブル全体のスキャンが発生します (in の間で使用できる場合は使用しないでください)
6. 次のクエリでもテーブル全体のスキャンが発生します。
select id from t where name like '%李%', select id from t where name like '%李'
効率を高めるために、この形式を使用できます select id from t where 「李%」のような名前を付けた場合は、全文検索も検討できます。
7. インデックス列での計算の使用を避けてください。言い換えれば、where 句のフィールドに対する式操作や関数操作を避けるようにしてください。これにより、エンジンはインデックスの使用を断念し、フルテーブルスキャンです。
例: select id from t where num/2=100 を次のように変更する必要があります: select id from t where num=100*2
8。多くの場合、次のようにすることをお勧めします。 Select:exists は、サブクエリが少なくとも 1 行のデータを返すかどうかを確認するために使用されます。サブクエリは実際にはデータを返しませんが、true または false の値を返します。
select num from a where num in(select num from b)
次のステートメントに置き換えます: select num from a where names (select 1 from b where num=a.num)
9. select from t をどこにも使用せず、「」を特定のフィールド リストに置き換え、未使用のフィールドを返さないでください。
10.>
の代わりに >= を使用します。効率的: SELECT * FROM EMP WHERE DEPTNO >=4
非効率的: SELECT * FROM EMP WHERE DEPTNO > 3
この 2 つの違いは、前者の DBMS は DEPT が 4 の最初のレコードに直接ジャンプするのに対し、後者は最初に DEPTNO=3 のレコードを見つけて、DEPT の最初のレコードまで前方スキャンすることです。 3件以上の記録。
11.having 句を Where 句に置き換えます
推奨チュートリアル: mysql ビデオ チュートリアル
以上がmysqlで全画面スキャンを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。