我在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)