使用具有已知最大计数的限制语句是否更快?

时间:2015-10-26 14:30:56

标签: sql select limit

来自大表的查询,如:

select something from sometable limit somecount;

我知道限制语句对于避免从查询中获取太多行很有用。 但是如果在没有多行的情况下使用它而在一张大桌子中呢? 例如,有一个像这样的表

CREATE TABLE if not exists users (
    id integer primary key autoincrement,
    name varchar(80) unique not null,
    password varchar(20) not null,
    role integer default 1,  -- 0 -> supper admin; 1 -> user
    banned integer default 0 
);

案例1:我希望获得id = 100的用户。这里的id是主键, 肯定它最多可以获得1行。下面两个语句之间的速度会更快?

select * from users where id=100;
select * from users where id=100 limit 1;

案例2:我想让用户名字=' jhon'。这里名字很独特, 它最多可以获得1行。下面两个语句之间的速度更快?

select * from users where name='jhon';
select * from users where name='jhon' limit 1;

案例3:我想让用户在role = 0。这里角色既不是主键 也不是唯一的,但我知道最多只有10行。哪个在两个陈述之间更快?

select * from users where role=0;
select * from users where role=0 limit 10;

1 个答案:

答案 0 :(得分:1)

如果您关心性能,请添加索引以处理所有三个查询。这需要一个额外的索引:users(role)id列已将索引作为主键; name有一个索引,因为它被声明为unique

对于前两种情况,limit不应该有所作为。如果没有limit,引擎会在索引中找到匹配的行并返回它。如果引擎不使用“唯一”信息,那么它可能需要查看索引中的下一个值,只是为了查看它是否相同。

第三种情况,没有索引,有点不同。如果没有索引,引擎将要扫描所有行以查找所有匹配项。使用索引,它可以在那里找到所有匹配的行。添加一个limit,它将停在第一个。

与平均使用limit相比,适当的索引对性能的影响更大。