这是我的表:
// 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)
这样的索引,以便查询或
答案 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)
但只有查询计划会显示是否会使用它。