-1

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

问题

我的查询没有执行,因为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

4

1 回答 1

0

您的 desc 输出并不表示该timestamp列是索引列。您能否提供 DDL,以便我们可以看到您实际上为它创建了索引?

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

于 2012-10-12T20:19:36.413 回答