MySQL查询优化:LIMIT 1避免全表扫描
在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率。
例如下面的用户表(主键id,邮箱,密码):
create table t_user(
id int primary key auto_increment,
email varchar(255),
password varchar(255)
);
每个用户的email是唯一的,如果用户使用email作为用户名登陆的话,就需要查询出email对应的一条记录。
SELECT * FROM t_user WHERE email=?;
上面的语句实现了查询email对应的一条用户信息,但是由于email这一列没有加索引,会导致全表扫描,效率会很低。
SELECT * FROM t_user WHERE email=? LIMIT 1;
加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。
LIMIT 1适用于查询结果为1条(也可能为0)会导致全表扫描的的SQL语句。
如果email是索引的话,就不需要加上LIMIT 1,如果是根据主键查询一条记录也不需要LIMIT 1,主键也是索引。
例如:
SELECT * FROM t_user WHERE id=?;
就不需要写成:
SELECT * FROM t_user WHERE id=? LIMIT 1;
二者效率没有区别。
附上我做的实验:
存储过程生成100万条数据:
BEGIN
DECLARE i INT;
START TRANSACTION;
SET i=0;
WHILE i<1000000 DO
INSERT INTO t_user VALUES(NULL,CONCAT(i+1,'@xxg.com'),i+1);
SET i=i+1;
END WHILE;
COMMIT;
END
查询语句
SELECT * FROM t_user WHERE email='222@xxg.com'; 耗时0.56 s
SELECT * FROM t_user WHERE email='222@xxg.com' LIMIT 1; 耗时0.00 s
MySQL查询优化:LIMIT 1避免全表扫描相关推荐
- mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描
索引是为了加速数据的检索,但是不合理的表结构或适应不当则会起到反作用.我们在项目中就遇到过类似的问题,两个十万级别的数据表,在做连接查询的时候,查询时间达到了7000多秒还没有查出结果. 首先说明,关 ...
- mysql limit会扫描全表_为什么用了limit还会进行全表扫描?
你的位置: 问答吧 -> PHP -> 问题详情 为什么用了limit还会进行全表扫描? 现有一张100万行记录的表test, 执行以下语句后: explain select * ...
- 范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效
范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效 当下MySQL数据库在多款数据库中脱颖而出,成为使用最广泛的数据库之一,这里我们来看看数据库索引上的一个问题.我们知道在数据量上去以 ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)
MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否 ...
- mysql in和or扫描全表_MySQL对OR条件查询不支持优化,会进行全表扫描
MySQL对OR条件查询不支持优化,会进行全表扫描:explain extended select * from like1 where name like 'abc%';例如:+----+----- ...
- mysql in 子查询无法使用索引全表扫描 慎用in
背景 最近慢sql 性能优化 发现一个调用频率高的sql 使用 in 子查询,导致外层全表扫描的问题? 为什么会产生这样的问题?特别强调在优化的使用发现 使用in 和优化后的效果差距 300倍,可见全 ...
- 33 | MySQL全表扫描会将内存打爆?(看了这篇你就赚)
一.前言 本篇主要分析全表扫描对server层.引擎层的影响. 二.全表扫描对server层的影响 2.1.server端对结果集的保存流程是什么样的?MySQL 是"边读边发的" ...
- 深入理解为什么MySQL全表扫描很慢?
在InnoDB的数据页到底长什么样?这篇文章里,我们讲了InnoDB数据页长什么样,简单回顾下. 图1 InnoDB数据页结构示意图(图片来自网络) 其中有的部分没有详细讲解,因为暂时还用不到.比如P ...
最新文章
- openlayers之style符号化
- 'cross-env' 不是内部或外部命令,也不是可运行的程序
- spring boot mybatis 整合_MyBatis学习:MyBatis和Spring整合
- [css] 你有用过弹性布局吗?说说你对它的理解
- C/C++语言函数学习(4)字符串处理函数
- inl和dnl matlab_请问如何用matlab仿真它的性能, 比如 INL, DNL, SFDR,EOB等等。
- 十五、新人成才之路《做人七项原则 做一个有爱心的人》
- vue-router: 路由传参
- php 依赖注入 数据库切换_PHP依赖注入(DI)和控制反转(IoC)详解
- win10系统镜像下载及在VMware虚拟机上创建win10虚拟机
- Excel图表数跨行选择数据
- ffmpeg压制视频命令及常用转码参数解析
- 医学病理图像:细胞间质与间质细胞的区别
- iOS 18位社会信用代码验证
- 基于javaweb的学生综合素质评价系统(java+ssm+thymeleaf+layui+mysql)
- STM32掌机教程7,演奏音乐
- SSRF 攻击PHP-FPM(FastCGI 攻击):学习总结仅供参考
- 整理10种电脑截图工具(附带下载地址)
- Missing artifact com.oracle:ojdbc7:jar:10.2.0.7.0
- 斯坦福博士李纪为成立 AI 金融公司香侬科技,获红杉中国数千万天使投资
热门文章
- 继承ViewGroup研究(汇总) 一、二、三
- 计算路由汇总的方法(CIDR)
- Ubuntu Server 16升級到Ubuntu Server 18操作步驟
- Vue 组件库 HeyUI@1.17.0 发布,新增 Skeleton 组件
- 用Python建立最简单的web服务器
- Slog42_支配vue框架初阶项目之博客网站-单页-默认头像的布局和定位
- Java练习:用IF()进行数字排序
- 动态路由协议RIP的基本原理与配置
- java--迭代(一)Iterator和Iterable接口
- Python实例浅谈之五Python守护进程和脚本单例运行