21

私はそのようなクエリを持っています

$query = "SELECT * FROM tbl_comments WHERE id=222 ORDER BY comment_time";

comment_timeフィールドにインデックスを追加する必要がありますか?

また、2 つの日付の間のデータを取得したい場合、どのようにインデックスを作成すればよいですか?

4

7 に答える 7

19

はい、ORDER BY を使用する場合、インデックスが役立ちます。INDEX はソートされたデータ構造であるため、リクエストはより高速に実行されます。

次の例を見てください: 3 行のテーブル test2。order by の後に LIMIT を使用して、実行の違いを示しました。

DROP TABLE IF EXISTS `test2`;
CREATE TABLE `test2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `value` varchar(10) CHARACTER SET utf8 COLLATE utf8_swedish_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `ix_value` (`value`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test2
-- ----------------------------
INSERT INTO `test2` VALUES ('1', '10');
INSERT INTO `test2` VALUES ('2', '11');
INSERT INTO `test2` VALUES ('2', '9');

-- ----------------------------
-- Without INDEX
-- ----------------------------

mysql> EXPLAIN SELECT * FROM test2 ORDER BY value LIMIT 1\G
*************************** 1. row *************************
           id: 1
  select_type: SIMPLE
        table: test2
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3
        Extra: Using filesort
1 row in set (0.00 sec)

MySQL は 3 行をチェックして結果を出力しました。CREATE INDEX の後、次のようになります。

mysql> CREATE INDEX ix_value ON test2 (value) USING BTREE;
Query OK, 0 rows affected (0.14 sec)

-- ----------------------------
-- With INDEX
-- ----------------------------

mysql> EXPLAIN SELECT * FROM test2 ORDER BY value LIMIT 1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test2
         type: index
possible_keys: NULL
          key: ix_value
      key_len: 32
          ref: NULL
         rows: 1
        Extra: Using index
1 row in set (0.00 sec)

現在、MySQL は 1 行のみを使用していました。

受け取ったコメントに答えて、LIMIT なしで同じクエリを試しました。

-- ----------------------------
-- Without INDEX
-- ----------------------------

mysql> EXPLAIN SELECT * FROM test2 ORDER BY value\G
*************************** 1. row ******************
           id: 1
  select_type: SIMPLE
        table: test2
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3
        Extra: Using filesort

-- ----------------------------
-- With INDEX
-- ----------------------------

mysql> EXPLAIN SELECT * FROM test2 ORDER BY value\G
*************************** 1. row *****************
           id: 1
  select_type: SIMPLE
        table: test2
         type: index
possible_keys: NULL
          key: ix_value
      key_len: 32
          ref: NULL
         rows: 3
        Extra: Using index

ご覧のとおり、2 番目の には index を使用しますORDER BY

フィールドにインデックスを作成するには、次を使用します。

CREATE INDEX ix_comment_time ON tbl_comments (comment_time) USING BTREE;

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

于 2013-05-28T12:55:40.390 に答える
11

次のようなクエリでは、フィールドのインデックスcomment_timeはまったく役に立たない可能性があります。

SELECT *
FROM tbl_comments
WHERE id=222
ORDER BY comment_time;

クエリは、一致する値を見つけるためにテーブルをスキャンする必要がありidます。これは、インデックスをスキャンし、行を検索し、テストを実行することで実行できます。一致する行が 1 つあり、その行に highext がある場合comment_time、インデックスをスキャンしてテーブルを読み取る必要があります。

インデックスがないと、テーブルをスキャンして行を見つけ、1 行を非常に迅速に並べ替えます。テーブルのシーケンシャル スキャンは通常、ページ ルックアップが後に続くインデックス スキャンよりも高速です (使用可能なメモリよりも大きなテーブルでは確実に高速になります)。

一方、上の索引id, comment_timeは非常に役立ちます。

于 2013-05-28T13:58:51.623 に答える
1

技術的には、すべてのフィールドにインデックスが必要というわけではありません。それも機能しますが、パフォーマンス上の理由から、1 つまたは複数のインデックスが必要になる場合があります。

編集

この問題は、ソフトウェア設計の初期から知られています。通常、プログラムが使用するメモリの量を増やすと、速度が低下します (プログラムが適切に作成されている場合)。フィールドにインデックスを割り当てると、データベースで使用されるデータが増加しますが、検索が高速になります。このフィールドで何も検索したくない場合 (実際には質問で検索します)、必要ありません。

現代では、インデックスはディスク データ サイズに比べてそれほど大きくなく、1 つまたは複数を追加することは悪い考えではありません。

通常、「インデックスが必要かどうか」を確実に判断することは非常に困難です。EXPLAINステートメントによっていくつかのヘルプが提供されます(マニュアルを参照してください)。

于 2013-05-28T12:49:03.617 に答える
0

データの取得速度を上げるには、インデックスが必要です。これは、インデックスがなくても機能します。WHERE2 番目の質問では、 andBETWEEN句を使用できます。

参照: http://www.w3schools.com/sql/sql_between.asp

于 2013-05-28T12:56:40.583 に答える