场景:有用户表user,有id,email,user_name,mobile等字段,现在要求根据指定email帐号查询一个用户。
乍一看,这个需求简单,不用考虑直接写出了一下sql
select * from user where email='[email protected]';
这时,就有可能踩雷了。
分析一下这个雷区,存在以下几种情形:
- 1.email列没有建立索引
这种情况下,就悲剧了。由于没有索引,即使email的记录不重复,也会全表扫描。
-
2.email列有普通索引
这种情况下能避免全表扫描,能用到索引,但是还会继续使用到where条件进行过滤。 - 3.email列有唯一索引
这种情况最高效,与where id=xxx几乎一样的效率(前提是id是主键索引)
解决方案
在仅查询一条记录的时候,无论where条件是否有索引有什么样的索引,最好在条件后面加limit 1限制一下。这样就能避免全表扫描,尽可能提高查询的效率。养成这样的意识习惯,就不会踩坑。
select * from user where email='[email protected]' limit 1;
原理:当mysql查询时,如果有limit 1限制,查询到满足条件的第一条记录的就返回结果,不会继续查询下去。
特殊情况
假如email列没有索引,且刚好记录在数据表的最后一条,这样limit 1实际上也会全表扫描,这种情况下就最好考虑给email列加索引。