mysql仅查询一条数据时的雷区

场景:有用户表user,有id,email,user_name,mobile等字段,如今要求根据指定email账号查询一个用户。mysql

乍一看,这个需求简单,不用考虑直接写出了一下sqlsql

select * from user where email='xxx@yyy.com';

这时,就有可能踩雷了。ide

分析一下这个雷区,存在如下几种情形:

  • 1.email列没有创建索引

这种状况下,就悲剧了。因为没有索引,即便email的记录不重复,也会全表扫描。code

  • 2.email列有普通索引
    这种状况下能避免全表扫描,能用到索引,可是还会继续使用到where条件进行过滤。索引

  • 3.email列有惟一索引
    这种状况最高效,与where id=xxx几乎同样的效率(前提是id是主键索引)

解决方案

在仅查询一条记录的时候,不管where条件是否有索引有什么样的索引,最好在条件后面加limit 1限制一下。这样就能避免全表扫描,尽量提升查询的效率。养成这样的意识习惯,就不会踩坑。it

select * from user where email='xxx@yyy.com' limit 1;

原理:当mysql查询时,若是有limit 1限制,查询到知足条件的第一条记录的就返回结果,不会继续查询下去。class

特殊状况

假如email列没有索引,且恰好记录在数据表的最后一条,这样limit 1实际上也会全表扫描,这种状况下就最好考虑给email列加索引。效率

相关文章
相关标签/搜索