select xx from tablexx where type in (1,3) and last<current-interval 30 second;
select xx from tablexx where type=1;
如果在(type,last)上创建索引,则第一个不会使用索引。
如果在(last,type)上创建索引,则第二个不会使用索引。
对于数据类型,可以从示例中看到,输入:int unsigned,last:datetime
答案 0 :(得分:1)
在第一个查询中,MySQL会在'last'上寻找一个索引,因为它是一个不等式。我希望它必须用'last'迭代所有记录
我希望你能用两个单独的索引获得同样好的表现,一个在'last'(第一个查询),一个在'type'(第二个查询)。
'EXPLAIN'命令对分析这些东西非常有帮助。
答案 1 :(得分:0)
第二个查询在where子句中只有type = 1
,只需要type
上的索引,而不是(type, last)
上的索引。
MySQL 应为您的查询选择最具体的索引,因此创建一个仅覆盖type
的索引应该用于第二个索引,而不是第一个索引。
答案 2 :(得分:0)
你说“如果创建索引(类型,最后),第一个将不使用索引。”你确定吗?我认为这正是覆盖索引执行的情况。 编辑:除非数据存在选择性问题 - 如果大多数记录的类型为1或3,则优化器不会使用索引(无论是基本索引还是复合索引)。