我正在执行以下查询以从我的表中获取每日用户登录详细信息。我发布了示例表和我正在执行的查询。
问题
我的查询未执行range
查询它检查整个表。它对我来说变得缓慢。如果我索引时间戳列没有用,因为时间戳之间没有重大差异,以毫秒为单位。我无法为表格的时间戳列编制索引,因为我的产品在生产设置中。它将包含数百万行。如何以range
或更好的解决方案执行此查询?
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
答案 0 :(得分:0)
您的desc输出并不表示timestamp
是索引列。你能提供DDL,以便我们可以看到你真的为它创建了一个索引吗?
或者,您可以使用2列来存储具有毫秒分辨率的时间戳,一列用于搜索,另一列用于额外分辨率。我可以想象组合:datetime
/ msec
,date
/ bigint-msec
,datetime
/ bigint-msec
。实际组合将取决于最常使用的查询类型。