来自大表的查询,如:
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;
答案 0 :(得分:1)
如果您关心性能,请添加索引以处理所有三个查询。这需要一个额外的索引:users(role)
。 id
列已将索引作为主键; name
有一个索引,因为它被声明为unique
。
对于前两种情况,limit
不应该有所作为。如果没有limit
,引擎会在索引中找到匹配的行并返回它。如果引擎不使用“唯一”信息,那么它可能需要查看索引中的下一个值,只是为了查看它是否相同。
第三种情况,没有索引,有点不同。如果没有索引,引擎将要扫描所有行以查找所有匹配项。使用索引,它可以在那里找到所有匹配的行。添加一个limit
,它将停在第一个。
与平均使用limit
相比,适当的索引对性能的影响更大。