4

何百万ものエントリを持つテーブルと、BIGINT(20)各行に固有の値を持つ列があります。これらは主キーではありませんが、特定の操作中に、句 SELECTでこの列を使用する何千もの があります。WHERE

Q: この列にインデックスを追加すると、エントリの数が数百万に増えたときに役立ちますか? INTテキスト値の場合は知っていますが、インデックスがorに対して何をするかについてはよくわかりませんBIGINT

SELECT何千回も発生するサンプルは次のようになります。

`SELECT * FROM table1 WHERE my_big_number=19287319283784
4

3 に答える 3

6

非常に大きなテーブルがある場合、インデックス付けされていない値に対する検索は非常に遅くなる可能性があります。MySQLの用語では、この種のクエリは「テーブルスキャン」になります。これは、テーブルの各行に対して順番にテストする必要があることを示す方法です。これは明らかにそれを行うための最良の方法ではありません。

インデックスを追加すると読み取り速度が向上しますが、支払う価格は書き込み速度が少し遅くなります。最適化を行う場合は常にトレードオフがありますが、あなたの場合、読み取り時間の短縮は計り知れませんが、書き込み時間の増加はわずかです。

大きなテーブルにインデックスを追加するにはかなりの時間がかかる可能性があるため、本番システムに適用する前に、本番データに対してこれをテストしてください。ALTER TABLEステートメントの期間中、テーブルはロックされる可能性があります。

いつものようEXPLAINに、クエリで使用して実行戦略を決定します。あなたの場合、それは次のようになります:

EXPLAIN SELECT * FROM table1 WHERE my_big_number=19287319283784
于 2012-11-13T20:02:43.677 に答える
1

Amazon ec2 スモール インスタンスに 2200 万行のテーブルがあります。したがって、それは決して最速のサーバー環境ではありません。私はこれを作成しました:

CREATE TABLE huge
(
    myid int not null AUTO_INCREMENT PRIMARY KEY,
    version int not null,
    mykey char(40) not null,
    myvalue char(40) not null,
    productid int not null
);

CREATE INDEX prod_ver_index ON huge(productid,version);

この呼び出しは即座に終了します:

select * from huge where productid=3333 and version=1988210878;

に関してはinserts、PHPで100/秒を実行できますが、配列に1000回の挿入を詰め込むと、この同じテーブルで内破を使用すると、1秒あたり3400回の挿入が得られます。当然、データはそのようにはなりません。サーバーが比較的きびきびしていると言っているだけです。しかし、tadman が示唆するように、そして彼が言うつもりEXPLAINだったのは、典型的なステートメントの前で、キー列が、それを実行した場合に使用されるインデックスを示しているかどうかを確認することです。

一般的なコメント

クエリのデバッグが遅い場合は、その単語を単語EXPLAINの前に置きselect(どんなに複雑であってselect/joinも)、それを実行します。結果セットを解決してクエリが通常の方法で実行されることはありませんが、db エンジンは (ほぼ即座に) 試行する実行計画を生成します。このプランは、実際のクエリが実行されたときに放棄される可能性があります (その前に EXPLAIN を配置する前のもの) が、スキーマの欠点に対する主要な手がかりになります。

の出力は、EXPLAIN最初に読む人にとっては不可解に見えます。長くはありませんが。Using EXPLAIN to Write Better MySQL Queriesなどのいくつかの記事を読んだ後、通常、クエリのどのセクションがどのインデックスを使用しているか、none を使用して遅いテーブルスキャンを実行しているか、遅い where 句を使用しているか、派生テーブルと一時テーブルを使用しているかを判断できます。 .

compositeスキーマに対してサイズアップされた EXPLAIN の出力を使用すると、インデックス作成 (およびインデックスなど) の戦略についての洞察をcovering得て、実質的なクエリ パフォーマンスを得ることができます。

共有

このEXPLAIN出力とスキーマ出力を他のユーザー (stackoverflow の質問など) と共有すると、パフォーマンスに関するより良い回答が得られます。スキーマ出力は、 などのステートメントでレンダリングされshow create table myTableNameます。共有してくれてありがとう。

于 2012-11-13T20:26:38.063 に答える
1

(クエリの例に基づいて)ルックアップ(SELECT)のパフォーマンスが向上しますが、挿入/更新も遅くなります。DB サイズも増加します。これらの SELECT 呼び出しと INSERT 呼び出しを行う頻度を確認する必要があります。多くの SELECT 呼び出しを行う場合、これにより全体的なパフォーマンスが向上するはずです。

于 2012-11-13T19:59:51.007 に答える