0

MySQL データベースに 3 つまたは 4 つのテーブルがあり、今後リリース予定の Android アプリに関連付けられています。これらのテーブルは、非常に高速に数千行に爆発する可能性があります。現時点では、実行する必要がある SELECT および 2 つの INSERT SQL コマンドが約 6 ~ 8 個あります。

調査を行った結果、ロード時間を短縮するにはインデックス作成を使用する必要があることがわかりました。これを理解できるかどうかを確認するために、さまざまなサイトでいくつかのチュートリアルを検索しましたが、これを行う方法と方法を非常に明確に説明しているものは見つかりませんでした。

状況は次のとおりです。

まず第一に、それは Godaddy MySQL サーバーを使用します。無制限の帯域幅と 150,000 MB。よく使われるテーブルの 1 つを次に示します。

items_id (整数 11)
アイテム (100 varchar)
cat_id (int 11)

PHPMyAdmin では、インデックスについて次のように述べています。

Keyname/PRIMARY type/PRIMARY Cardinality/576 items_id

ということで、指標ができたみたいですね。

このテーブル (SELECT) に関連する 1 つの SQL クエリ (PHP 経由) を次に示します。

 "SELECT * FROM items WHERE cat_id = ' ".$_REQUEST['category_id']."' ORDER BY TRIM(LEADING 'The ' FROM item) ASC;"

そしてもう1つ(挿入):

 "INSERT INTO items (item, cat_id) VALUES ('{$newItem}', '{$cat_id}')"

私の主な質問は次のとおりです。これらの方法では、可能な限り最高の速度を利用して、確立されたインデックスを利用していますか? それとも、これには「遅い」と書かれていますか?

4

1 に答える 1

1

インデックスを利用するために単純な選択/挿入を変更することはできません。

ただし、テーブルにインデックスを追加して、クエリの実行を高速化することができます。

InnoDB をストレージ エンジンと外部キー制約として使用していない限り、実際には挿入はインデックスに対して何も行いません。

select ステートメントの where / group by / order by 句で列を使用している場合は、それにインデックスを追加することを検討してください。EXPLAIN原因のクエリで使用し、データベース エンジンが where 句で列をどのように使用するかを確認することをお勧めします。

列に一意でない可能性のある値の小さなセット (性別: 男性/女性) がある場合、すべての女性またはすべての男性 (およびテーブルの半分) を検索するわけではないため、インデックスを追加する意味はほとんどありません。テーブル全体の検索とあまり変わらない)。ただし、その列を別の列と一緒に使用してフィルター処理/グループ化/並べ替えを行う場合は、それらに複合インデックス (複数列インデックス) を追加することをお勧めします。

MySQL 内のデータベースはフォルダーとして編成されます。フォルダには、テーブルごとに複数のファイルが含まれています。

テーブル定義ファイル、テーブル データ ファイル、およびいくつかのインデックス ファイルがあります。1 つまたは複数の列のインデックスを定義すると、そのインデックスのファイルが作成されます。

主キーでさえないインデックスがない場合、Selectステートメントは完全なテーブル検索を実行し、数十万のエントリに対して著しく遅くなります。

インデックスを定義すると、その列または列セットのテーブル内のすべての一意の値が読み取られ、その列またはそれらの列の特定の値とそれを含むレコードの間の対応をリストするファイルが書き込まれます。

このファイルは、データ ファイルよりもはるかに小さく、通常は他のインデックス ファイルと一緒に完全にメモリに収まる必要があります。MySQL は、そのファイル内の一致するレコード リストを交差させて、選択基準に一致するレコードを見つけ、データ テーブルから必要なデータをチェリー ピックする必要があります。

プライマリ インデックスとユニーク インデックスでは、1 つの値と 1 つのレコードが直接対応しています。したがって、一意の値による検索は高速です。

于 2012-06-27T23:38:28.583 に答える