【发布时间】:2020-09-16 11:32:56
【问题描述】:
我有一个包含 2 亿行的表,其中索引是在日期时间数据类型的“created_at”列中创建的。
显示创建表 [tablename] 输出:
create table `table`
(`created_at` datetime NOT NULL)
PRIMARY KEY (`id`)
KEY `created_at_index` (`created_at`)
ENGINE=InnoDB AUTO_INCREMENT=208512112 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci'
created_at 范围为 2020-04-01 ~ 2020-05-28。
我只想获取 2020-05-15 23:00:00 之后的行。
当我跑步时:
EXPLAIN SELECT created_at
FROM table
where created_at >= '2020-05-15 23:00:00';
它说它输出:
rows Extra
200mil Using Where
我的理解是,在 RDMS 中,如果没有未排序的索引行,但是当您在列上创建索引时,它是按排序顺序排列的,因此在找到 '2020-05-15 23:00:00' 之后它会简单地返回之后的所有行。
另外,由于它的基数是 700 万,我认为使用索引会比全表扫描更好。
是因为我输入了日期作为字符串吗?但是当我尝试时
where created_at >= date('2020-05-15 23:00:00');
还是一样。
和
where created_at >= datetime('2020-05-15 23:00:00');
输出语法错误。
mysql 是否只是决定进行全表扫描会更有效?
编辑:
使用等号
EXPLAIN SELECT created_at
FROM table
where created_at = '2020-05-15';
输出:
key_len ref rows Extra
5 const 51
在 where 子句中,如果我将字符串更改为 date('2020-05-15'),它会输出:
key_len ref rows Extra
5 const 51 Using index condition
这是否意味着第一个相等查询没有使用索引?
【问题讨论】:
-
请为您的表分享
show create table的输出。 -
@GMB 你这是什么意思?我是如何创建我的表的?
-
运行
show create [tablename]
标签: mysql sql date query-optimization where-clause