mysql 简单的sql优化示例[不定时更新]

对于慢sql的分析步骤:

1) desc|explain sql 查看执行计划, 对于type很慢的, 分析是否建立了对应字段的索引

2) 进行排除法, 把子查询抽离出来, 单独执行,定位慢查询是哪个子查询导致的. 专门进行优化.

脚本:

CREATE TABLE stu (

id BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键‘,

NAME VARCHAR(50) NOT NULL DEFAULT ‘‘ COMMENT ‘名称‘,

phone BIGINT(20) NULL COMMENT ‘电话‘,

UNIQUE KEY idx_phone (phone)

)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT ‘测试_学生表‘;

CREATE TABLE course (

id BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键‘,

NAME VARCHAR(50) NOT NULL DEFAULT ‘‘ COMMENT ‘名称‘

)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT ‘测试_课程表‘;

CREATE TABLE stu_course (

id BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键‘,

stu_id BIGINT(20) NOT NULL COMMENT ‘学生id‘,

cous_id BIGINT(20) NOT NULL COMMENT ‘课程id‘,

score INT(11) NOT NULL DEFAULT 0 COMMENT ‘分数‘,

KEY idx_stu_id (stu_id),

KEY idx_cous_id (cous_id)

)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT ‘测试_学生课程关联表‘;

1. OR 变 UNION ALL

前:

SELECT id FROM stu WHERE id=10 OR id=20

后:

SELECT id FROM stu WHERE id=10

UNION ALL

SELECT id FROM stu WHERE id=20

2. IN (子查询) 变 INNER JOIN

前:

SELECT id FROM stu WHERE id IN (SELECT stu_id FROM stu_course)

后:

SELECT id FROM stu s

INNER JOIN (SELECT stu_id FROM stu_course) tmp ON s.id = tmp.stu_id

3. NOT IN (子查询) 变 LEFT JOIN

前:

SELECT id FROM stu WHERE id NOT IN (SELECT stu_id FROM stu_course)

后:

SELECT id FROM stu s

LEFT JOIN (SELECT stu_id FROM stu_course) tmp ON s.id = tmp.stu_id

WHERE tmp.stu_id IS NULL

4. IN 变 EXISTS

前:

SELECT id FROM stu WHERE id IN (SELECT stu_id FROM stu_course)

后:

SELECT id FROM stu s WHERE EXISTS (SELECT sc.stu_id FROM stu_course sc WHERE sc.stu_id = s.id)

时间: 2024-11-03 21:35:29

mysql 简单的sql优化示例[不定时更新]的相关文章

Mysql命令详细汇总[未完][不定时更新]

先从最最最基础的开始 一.登录/退出 登录:mysql -h hostname -u username -p 退出:exit; 二.导入/导出[注意:这是在shell下直接敲命令,不用也不能登录mysql] 导入:mysql -hostname -u username -p < filepath/filename.sql 导出:mysqldump -hostname -u username -p > filepath/filename.sql 同时也可以登录mysql使用source命令 导入

【MySQL笔记】SQL优化利器 - explain命令的输出格式详解

有MySQL使用经验的同学在实际项目中可能会遇到SQL慢查询的场景,有些场景很容易定位问题所在(如单表操作有慢查询SQL时,仔细check SQL语句通常很容易定位索引问题),而有些复杂业务场景下(如多表联合查询几十个字段并做group或sort等操作),人工check SQL语句通常很难发现SQL瓶颈根源.这个时候,MySQL提供的explain命令就派上用场了. 本笔记主要对explain的输出结果做说明,并给出根据explain输出对SQL做优化的思路. 1. EXPLAIN语法及用途 e

MySQL专题3 SQL 优化

这两天去京东面试,面试官问了我一个问题,如何优化SQL 我上网查了一下资料,找到了不少方法,做一下记录 (一). 首先使用慢查询分析  通过Mysql 的Slow Query log 可以找到哪些SQL运行很慢.耗时间  在my.ini中: long_query_time=1 log-slow-queries=d:\mysql5\logs\mysqlslow.log 把超过1秒的记录在慢查询日志中 可以用mysqlsla来分析之.也可以在mysqlreport中,有如 DMS分别分析了selec

MySQL 5.6 SQL 优化特性

http://blog.chinaunix.net/uid-259788-id-4146363.html http://www.cnblogs.com/Amaranthus/p/4028687.html   MYSQL 5.6手册 http://www.cnblogs.com/hustcat/category/214566.html   YY哥 http://blog.163.com/li_hx/blog/static/18399141320150253652874/ 那海蓝蓝 http://t

MySQL 学习四 SQL优化

MySQL逻辑架构: 第一层:客户端层,连接处理,授权认证,安全等功能.   第二层:核心层,查询解析,分析,优化,缓存,内置函数(时间,数学,加密),存储过程,触发器,视图   第三层:存储引擎.负责MySQL中数据的存储和提取. MySQL查询过程 客户端/服务端通信协议: 1 学习使用EXPLAIN ??? 2 创建正确的索引 数据库的索引像书的索引一样,他们的位置信息被保存,并且包含数据库的主要信息.可以使用EXPLAIN来查找 缺失的索引. 3 拒绝默认的设置:有三个关于MySQL性能

Oracle sql优化示例

1. 循环插入1到10w数值 1 create or replace procedure proc_test 2 as 3 begin 4 for i in 1..100000 5 loop 6 execute immediate 7 'insert into t values(' || i || ')'; 8 commit; 9 end loop; 10 end; 11 / 2. 使用变量绑定,减少sql解析 1 create or replace procedure proc_test 2

Mysql 分页查询sql优化

SELECT COUNT(id) FROM ts_translation_send_address EXPLAIN SELECT * FROM ts_translation_send_address ORDER BY id LIMIT 2000000,10; SELECT * from ts_translation_send_address t INNER JOIN ( SELECT ID FROM ts_translation_send_address ORDER BY id limit 20

MySQL常用查询语句汇总(不定时更新.......)

在这篇文章中我会通过一些例子来介绍日常编程中常用的SQL语句 目录: ## 1.数据库的建立 ## 2.常用查询 ## 1.数据库的建立 实例将ER图的形式给出: 由此转换的4个关系模式:                    注:下划线为直线为主键,下划线为红色虚线为外键 由此可以建立如下数据库: C: S: SC: T: 数据库的具体建立脚本请查看  我的github ## 2.常用查询 查询年龄最小的四个人(按年龄从小到大排序,如果年龄相同,按姓名顺序排序) SELECT * FROM s

有用的sql整理(不定时更新)

1.关于日期条件作为where子句时需要注意的点.select 字段 from 表 where 时间字段 > date'2012-12-31' + 0.99999 and 时间字段 < date'2013-02-01';上面这个时间判断的时间段就是2013年1月1日零点到2013年1月31日二十三点五十九分五十九秒,前方加上的0.99999就是屏蔽掉由时分秒造成的查询不准确问题.2.在oracle中查询条件如果采用like的方式那么匹配条件中如果是'%*'以百分号开始则不会执行索引.3.在wh