[转]Mysql中的SQL优化与执行计划
From : http://religiose.iteye.com/blog/1685537
一,如何判断SQL的执行效率?
通过explain 关键字分析效率低的SQL执行计划。
比如: explain select sum(moneys) from sales a, company b where a.company_id = b.company_id and a.year = 2006;
id : 1
select_type: SIMPLE
table:
type:
1.row:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 1000 | Using where |
2.row
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | b | ref | ind_company_id | ind_company_id | 5 | sakila.a.company_id | 1 | Using where;Using index |
select_type: SIMPLE, 简单表,不使用表连接或子查询;PRIMARY,主查询,即外层的查询;UNION,UNION中的第二个查询或后面的查询;SUMQUERY,子查询中的第一个SELECT。
table: 输出结果集的表。
type: 表示表的连接类型,性能由好到坏,依次为,
system,表中只有一行,常量表。
const,单表中最多有一行匹配,如pramary key 或者 unique index
eq_ref,对于前面的每一行,此表中只查询一条记录,比如多表连接中,使用primary key 或 unique index
ref,与eq_ref 类似,区别在于不是primary key 或qunique index, 而是普通索引。
ref_or_null,与ref 类似,区别在于查询中包含对null的查询。
index_merge,索引合并优化
unique_subquery,in的后面是一个查询主键字段的子查询。
index_subquery,与unique_subquery类似,区别在于是查询非唯一索引字段的子查询。
range,单表中的范围查询。
index,对于前面的每一行,都通过查询索引来得到数据。
all,全表扫描。
possible_keys: 表示查询时,可能使用的索引。
key:表示实际使用的索引。
key_len:索引字段的长度。
rows:扫描行的数量。
Extra:执行情况的说明和描述。
二,如何通过查询数据库各操作的比例及索引使用次数来判断数据库索引及使用是否合理?
1, 命令: >show status like 'Com_%';
结果:Com_xxx 表示每个xxx语句的执行次数。如:
Com_select, Com_insert,Com_update,Com_delete。
特别的,针对InnoDB:
Innodb_rows_read,select查询返回的行数
Innodb_rows_inserted,执行insert操作插入的行数 等等。
通过以上可以查看该数据库的读写比例,以便优化。
2, 命令:>show status like 'Handler_read%'
查看索引使用次数。
三,何时匹配到索引?
明确第一索引,第二索引的含义。回表,覆盖索引等优化方法。这里不再赘述。特别的,组合索引只能前缀匹配。同样,like 关键字也只能前缀匹配索引,通配符不能放在第一个字符。
四,何时不走索引?
1,如果mysql 估计索引使用比全表扫描更慢,则不使用索引。例如几乎获取全表数据的范围查询等等。
2,or 分开的条件,OR前的条件列有索引,后面的没有索引,那么涉及的索引都不会用到。
3,条件不是组合索引的第一部分,即不满足前缀左匹配的条件。
4,like 条件以%开始,则不走索引。
5,where 条件后如果是字符串,则一定要用引号括起来,不然自动转换其他类型后,不会走索引。
五,常用SQL优化
1,大批量插入数据,使用多值语句插入。
insert into test values (1,2),(2,3),(2,4)......
2, 优化group by, 默认情况下,mysql 会对所有group by C1,C2,C3 ... 的字段排序,与order by C1,C2,C3 类似,所以在group by 中增加相同列的order by 性能没什么影响。
如果用户想避免排序带来的影响,可以显式指定不排序,后面加上order by NULL。
3,order by 后面的顺序与索引顺序相同,且与where 中使用的条件相同,且是索引,则才会走真正索引。
4,in + 子查询的 SQL 尽量用join 连接来代替。
5,OR 之间的每个条件列都必须用到索引。
六,深层一些的优化
考虑每次查询时的IO消耗,回表次数;考虑表设计时,数据结构的不同,比如varchar ,char 区别;考虑表设计时每行数据的大小,尽量保持在128K以内,让其在一页内,避免跨页,大数据行。
[转]Mysql中的SQL优化与执行计划的更多相关文章
- Mysql中的sql是如何执行的 --- 极客时间学习笔记
MySQL中的SQL是如何执行的 MySQL是典型的C/S架构,也就是Client/Server架构,服务器端程序使用的mysqld.整体的MySQL流程如下图所示: MySQL是有三层组成: 连接层 ...
- oracle中查看sql语句的执行计划
1.在pl/sql中打开cmd命令容器 2.在cmd命令窗口中输入:explain plan for select * from t; 3.查看sql语句的执行计划:select * from tab ...
- MySQL中的SQL的常见优化策略
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...
- MySQL 学习四 SQL优化
MySQL逻辑架构: 第一层:客户端层,连接处理,授权认证,安全等功能. 第二层:核心层,查询解析,分析,优化,缓存,内置函数(时间,数学,加密),存储过程,触发器,视图 第三层:存储引擎.负 ...
- MySQL优化之执行计划
前言 研究SQL性能问题,其实本质就是优化索引,而优化索引,一个非常重要的工具就是执行计划(explain),它可以模拟SQL优化器执行SQL语句,从而让开发人员知道自己编写的SQL的运行情况. 执行 ...
- mysql一条sql语句如何执行的?
mysql 一条sql语句如何执行的? 文章内容源自:极客时间-林晓彬老师-MySQL实战45讲 学习整理 在了解一条查询语句如何执行之前,需要了解下MySQL的基本架构是怎样的,如下图所示: 可以看 ...
- (6)MySQL进阶篇SQL优化(MyISAM表锁)
1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...
- 【原创】6. 在MYSQL++中实现SQL语法中的NULL
这次要说明的是在MYSQL++中为了实现SQL中的NULL而做出的一系列的举措.我的感觉是Null<T, B>类型通常出现在SSQLS和template Query中比较多. 1. 什么是 ...
- MySQL中的索引优化
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...
随机推荐
- JdbcTemplate使用小结
org.springframework.jdbc.core.JdbcTemplate.query(String sql, Object[] args, RowMapper<StaffUnionV ...
- 多线程学习笔记七之信号量Semaphore
目录 简介 数据结构 示例 实现分析 构造方法 信号量的获取(公平方式) 信号量的释放(公平方式) nonfairTryAcquireShared(int acquires) 总结 简介 Sema ...
- 隐马尔科夫模型(HMM)与词性标注问题
一.马尔科夫过程: 在已知目前状态(现在)的条件下,它未来的演变(将来)不依赖于它以往的演变 (过去 ).例如森林中动物头数的变化构成——马尔可夫过程.在现实世界中,有很多过程都是马尔可夫过程,如液体 ...
- BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...
- Codeforces Round #374 (Div. 2) B. Passwords 贪心
B. Passwords 题目连接: http://codeforces.com/contest/721/problem/B Description Vanya is managed to enter ...
- Linux——多线程下解决生产消费者模型
我们学习了操作系统,想必对生产消费者问题都不陌生.作为同步互斥问题的一个经典案例,生产消费者模型其实是解决实际问题的基础模型,解决很多的实际问题都会依赖于它.而此模型要解决最大的问题便是同步与互斥.而 ...
- Maven 项目不打包 *.hbm.xml 映射文件
使用 Maven 部署 Java Web 项目时,Hibernate 的映射文件 *.hbm.xml 没有被打包部署到目标目录下,解决方法:在 pom.xml 文件中 <build> 节点 ...
- 使用 IntraWeb (14) - 基本控件之 TIWHRule、TIWRectangle
TIWHRule //一条横线, 对应 Html 中的 <hr/> TIWRectangle //矩形; 中间可以有行文本, 文本可任意对齐 TIWHRule 所在单元及继承链: IWHT ...
- Consul功能简介
Consul 是 HashiCorp 公司的一个用于实现分布式系统的服务发现与配置工具.Consul内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案.由 ...
- External Input Counter and External interrupt
External Input Counter and External interrupt : count the input signal from the button. So what is t ...