这是我的表:
// 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)
之类的索引,以使有关
的查询受益
或
- 引用的句子是正确的,无需任何索引以上查询
?
我需要创建一个像mytable(unix_time)这样的更多索引以使查询
是。不是&lt;vs> or =这是问题。这是索引中的列以及哪个顺序。
如果您在做
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,则数据库可以使用它。
是的,这是准确的:
有>或&lt;或之间或> =或lt; =运算符,那么该列应该是复合索引中的最后一列。
但是,在这种情况下,因为您也没有选择用户_id,所以没关系。
仅查询计划显示如何运行查询。但是您为该查询提供了不良索引,因为unix_time是第二字段。该查询的好索引是
mytable(unix_time, user_id)
或
mytable(unix_time)
,但只有查询计划显示是否使用它。