MYSQL范围条件仅适用于索引列

MYSQL范围条件仅适用于索引列,mysql,mysqldump,Mysql,Mysqldump,我正在执行下面的查询以从我的表中获取每日用户登录详细信息。我发布了示例表和正在执行的查询 问题 我的查询不是作为rangeQuery执行的,它检查整个表。对我来说,它变慢了。如果我对时间戳列进行索引,则时间戳列没有用处,因为时间戳之间没有以毫秒为单位的主要差异。我无法为表的时间戳列编制索引,因为我的产品处于生产设置中。它将包含数百万行。如何将此查询作为范围执行一个或任何更好的解决方案 MYSQL表 +---------------+--------------------------------

我正在执行下面的查询以从我的表中获取每日用户登录详细信息。我发布了示例表和正在执行的查询

问题

我的查询不是作为
range
Query执行的,它检查整个表。对我来说,它变慢了。如果我对时间戳列进行索引,则时间戳列没有用处,因为时间戳之间没有以毫秒为单位的主要差异。我无法为表的时间戳列编制索引,因为我的产品处于生产设置中。它将包含数百万行。如何将此查询作为
范围执行
一个或任何更好的解决方案

MYSQL表 +---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |表|创建表|

+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SignInDetails | CREATE TABLE `SignInDetails` (
  `USER_ID` bigint(20) DEFAULT NULL,
  `UserName` char(200) DEFAULT NULL,
  `TIMESTAMP` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
查询

select USER_ID,TIMESTAMP from SignInDetails where TIMESTAMP 
between UNIX_TIMESTAMP(CURRENT_DATE()-INTERVAL 1 DAY)*1000 and 
UNIX_TIMESTAMP(CURRENT_DATE())*1000
解释输出

    +----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | SignInDetails | ALL  | NULL          | NULL | NULL    | NULL |   21 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
表中的行总数


21

您的desc输出并不表示
时间戳
是索引列。您能提供DDL吗,这样我们就可以看到您实际上为它创建了一个索引


或者,您可以使用两列以毫秒分辨率存储时间戳,一列用于搜索,另一列用于额外分辨率。我可以想象组合:
datetime
/
msec
date
/
bigint msec
datetime
/
bigint msec
。实际的组合取决于最常用的查询类型。

实际上,我的意思是没有为timestamp列创建索引。请再次阅读我的问题“我无法为表的时间戳列编制索引,因为我的产品处于生产设置中”。索引对时间戳列有用吗?如果我现在理解正确的话。为了高效地搜索数据,在大多数情况下,您需要对数据进行索引。如果您提供的查询是您在表上运行的select的唯一类型,那么添加一个
date
type列并对其进行索引可能是有意义的,因为在这种情况下,您在bigint列上的索引可能效率较低。您还可以按天查看和划分数据。