我在mysql innodb中有一个表,如下所示:

messageIdStart | messageIdEnd | blob
------------------------------------
      40             50         ...
      51             58         ...
      59             70         ...

                ...

我想得到所有id大于特定值的行。
例如,我希望所有具有ID大于55的消息的行。我会做:
select * from table
    where messageIdStart >= 55 or messageIdEnd <= 55;

这将给出示例数据中的最后两行,这很好。
这种类型的查询需要全表扫描吗?规模会不会很小?这两列上都有索引。
如果每条消息有一行,我可以简单地执行以下操作:
select * from table where messageId >= 55;

但这是我继承的。
我正在考虑尝试将数据集重新格式化为第二种格式,但不想过早地进行优化。
谢谢

最佳答案

您拥有的查询可能会查看您已经拥有的索引。你应该使用EXPLAIN和EXPLAIN EXTENDED来确认这是真的。

explain select * from table
where messageIdStart >= 55 or messageIdEnd <= 55;

如果看到查询导致选择索引,则不执行表扫描。我假设MySQL将使用索引。
您还可以提供hints to the query这样的服务:
select * from table use index (idx_table_messageIdStart)
where messageIdStart >= 55 or messageIdEnd <= 55;

在一个小表上,数据库引擎可以识别适当的索引,如果它相信表扫描会更快,则仍然可以执行表扫描(Example

10-07 16:01