我是否需要在“订购依据”字段上添加索引?
2022-08-30 19:54:51
我有这样的查询
$query = "SELECT * FROM tbl_comments WHERE id=222 ORDER BY comment_time";
是否需要在字段上添加索引?comment_time
另外,如果我想获取两个日期之间的数据,那么我应该如何构建索引?
我有这样的查询
$query = "SELECT * FROM tbl_comments WHERE id=222 ORDER BY comment_time";
是否需要在字段上添加索引?comment_time
另外,如果我想获取两个日期之间的数据,那么我应该如何构建索引?
是的,索引将在使用 ORDER BY 时为您提供帮助。由于 INDEX 是排序的数据结构,因此请求的执行速度会更快。
看看这个例子:3行的表test2。我在订购后使用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行以输出结果。创建索引后,我们得到这个:
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行。
回答收到的评论,我尝试了相同的查询,没有限制:
-- ----------------------------
-- 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
正如我们所看到的,它使用索引,用于2nd 。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;
查询需要扫描表以查找匹配的值。它可以通过扫描索引、查找行和执行测试来执行此操作。如果有一行匹配并且它具有 highext ,则需要扫描索引并读取表。id
comment_time
如果没有索引,它将扫描表,找到该行,并非常快速地对 1 行进行排序。表的顺序扫描通常比索引扫描后进行页面查找更快(并且对于大于可用内存的表肯定会更快)。
另一方面,索引将非常有帮助。id, comment_time