当有>时,我需要什么样的索引?操作者?

时间:2016-12-08 14:26:33

标签: mysql sql indexing

这是我的表:

// mytable
+----+---------+-------------+
| id | user_id |  unix_time  |
+----+---------+-------------+
| 1  | 324435  | 1481199265  |
| 2  | 745645  | 1481194241  |
| 3  | 547346  | 1481291987  |
+----+---------+-------------+

这是我目前的综合指数:

mytable(user_id, unix_time)

这是我的一个疑问:

DELETE FROM mytable WHERE unix_time < unix_timestamp(subdate(now(), interval '1' YEAR))

我在某处读过:

  

当有><BETWEEN>=<=运算符时,该列应该是复合索引中的最后一列。

如您所见,<运算符和unix_time都是我当前索引中的最后一个(由于另一个查询,我创建了索引) ..现在我想知道,或者:

  • 我是否需要再创建一个像mytable(unix_time)这样的索引,以便查询

  • 引用的句子是正确的,无需任何其他索引进行上述查询

2 个答案:

答案 0 :(得分:1)

  

我是否需要创建一个像mytable(unix_time)这样的索引来使查询受益

是。它不是&lt; vs&gt;或=这是问题。它是哪个列在索引中,以及按哪个顺序排列。

如果你在做

DELETE FROM mytable 
WHERE unix_time < unix_timestamp(subdate(now(), interval '1' YEAR))
    AND user_id=123456

然后将使用user_id + unix_time上的索引。此外,如果现有索引位于unix_time + user_id上,而不是user_id + unix_time,则数据库可以使用它。

是的,这是准确的:

  

当有&gt;或者&lt;或BETWEEN或&gt; =或&lt; =运算符,那么该列应该是复合索引中的最后一列。

但在这种情况下,因为您还没有选择user_id,所以没关系。

答案 1 :(得分:1)

仅查询计划显示如何运行查询。但是你为该查询提供了错误的索引,因为unix_time是第二个字段。该查询的良好索引是

mytable(unix_time, user_id)

mytable(unix_time)

但只有查询计划会显示是否会使用它。