私はそのようなクエリを持っています
$query = "SELECT * FROM tbl_comments WHERE id=222 ORDER BY comment_time";
comment_time
フィールドにインデックスを追加する必要がありますか?
また、2 つの日付の間のデータを取得したい場合、どのようにインデックスを作成すればよいですか?
私はそのようなクエリを持っています
$query = "SELECT * FROM tbl_comments WHERE id=222 ORDER BY comment_time";
comment_time
フィールドにインデックスを追加する必要がありますか?
また、2 つの日付の間のデータを取得したい場合、どのようにインデックスを作成すればよいですか?
はい、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;
次のようなクエリでは、フィールドのインデックスcomment_time
はまったく役に立たない可能性があります。
SELECT *
FROM tbl_comments
WHERE id=222
ORDER BY comment_time;
クエリは、一致する値を見つけるためにテーブルをスキャンする必要がありid
ます。これは、インデックスをスキャンし、行を検索し、テストを実行することで実行できます。一致する行が 1 つあり、その行に highext がある場合comment_time
、インデックスをスキャンしてテーブルを読み取る必要があります。
インデックスがないと、テーブルをスキャンして行を見つけ、1 行を非常に迅速に並べ替えます。テーブルのシーケンシャル スキャンは通常、ページ ルックアップが後に続くインデックス スキャンよりも高速です (使用可能なメモリよりも大きなテーブルでは確実に高速になります)。
一方、上の索引id, comment_time
は非常に役立ちます。
技術的には、すべてのフィールドにインデックスが必要というわけではありません。それも機能しますが、パフォーマンス上の理由から、1 つまたは複数のインデックスが必要になる場合があります。
編集
この問題は、ソフトウェア設計の初期から知られています。通常、プログラムが使用するメモリの量を増やすと、速度が低下します (プログラムが適切に作成されている場合)。フィールドにインデックスを割り当てると、データベースで使用されるデータが増加しますが、検索が高速になります。このフィールドで何も検索したくない場合 (実際には質問で検索します)、必要ありません。
現代では、インデックスはディスク データ サイズに比べてそれほど大きくなく、1 つまたは複数を追加することは悪い考えではありません。
通常、「インデックスが必要かどうか」を確実に判断することは非常に困難です。EXPLAIN
ステートメントによっていくつかのヘルプが提供されます(マニュアルを参照してください)。
データの取得速度を上げるには、インデックスが必要です。これは、インデックスがなくても機能します。WHERE
2 番目の質問では、 andBETWEEN
句を使用できます。