我有一张包含2亿行的表,其中索引是在“created_at”列上创建的,该列是日期时间数据类型。
show create table [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
据我所知,在关系型数据库管理系统中,如果没有索引,则行不会被排序,但是当您在列上创建索引时,它将按排序顺序排列,因此在找到“2020-05-15 23:00:00”之后,它将简单地返回该时间点之后的所有行。
另外,由于其基数为7百万,我认为使用索引比全表扫描更好。
是因为我输入的日期是字符串吗?但是当我尝试时
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
输出。 - GMBshow create [tablename]
。 - Ali Akbar Azizi