MYSQL范围标准仅适用于索引列

时间:2012-10-12 19:53:55

标签: mysql mysqldump

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

问题

我的查询未执行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

1 个答案:

答案 0 :(得分:0)

您的desc输出并不表示timestamp是索引列。你能提供DDL,以便我们可以看到你真的为它创建了一个索引吗?

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