我在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;
但这是我继承的。
我正在考虑尝试将数据集重新格式化为第二种格式,但不希望过早优化。
由于
答案 0 :(得分:1)
您拥有的查询可能会查看您已有的索引。您应该使用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)
,它仍然可以进行表扫描答案 1 :(得分:0)
这取决于您执行'&gt; ='或'&lt; ='操作的属性。如果该属性有tree based index可用,则不需要整个表扫描。你可以简单地删除掉掉范围之外的子树。
如果存在任何其他类型的索引或该属性上没有索引,则必须执行全表扫描。