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列上的索引可能效率较低。您还可以按天查看和划分数据。