一、通过show status和应用特点了解各种SQL的执行频率

通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladmin extended-status命令获得。SHOW STATUS可以根据需要显示session级别的统计结果和global级别的统计结果。

以下几个参数对Myisam和Innodb存储引擎都计数:

1.Com_select  执行select操作的次数,一次查询只累加1;

2.Com_insert 执行insert操作的次数,对于批量插入的insert操作,只累加一次;

3.Com_update 执行update操作的次数;

4.Com_delete 执行delete操作的次数;



以下几个参数是针对Innodb存储引擎计数的,累加的算法也略有不同:

1.       Innodb_rows_read select查询返回的行数;

2.       Innodb_rows_inserted执行Insert操作插入的行数;

3.       Innodb_rows_updated 执行update操作更新的行数;

4.       Innodb_rows_deleted 执行delete操作删除的行数;

通过以上几个参数,可以很容易的了解当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的SQL大致的执行比例是多少。对于更新操作的计数,是对执行次数的计数,不论提交还是回滚都会累加。



对于事务型的应用,通过Com_commit和Com_rollback可以了解事务提交和回滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。

此外,以下几个参数便于我们了解数据库的基本情况:

1.Connections 试图连接Mysql服务器的次数

2.Uptime    服务器工作时间

3.Slow_queries 慢查询的次数

二、定位执行效率较低的SQL语句

可以通过以下两种方式定位执行效率较低的SQL语句:

1.可以通过慢查询日志定位那些执行效率较低的sql语句,用--log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。可以链接到管理维护中的相关章节。



2.慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态,是否锁表等等,可以实时的查看SQL执行情况,同时对一些锁表操作进行优化。

三、通过EXPLAIN分析低效SQL的执行计划

通过以上步骤查询到效率低的SQL后,我们可以通过explain或者desc 获取MySQL如何执行SELECT语句的信息,包括select语句执行过程表如何连接和连接的次序。

explain可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。

 

mysql> explain select sum(moneys) from sales a,companys b where a.company_id = b.id and a.year = 2006;

+----------------+----------+-----------+----------------+----------------+----------+-----------+----------------+

| select_type   | table | type  | possible_keys| key            | key_len   | rows  | Extra     |

+----------------+----------+-----------+----------------+----------------+----------+-----------+----------------+

| SIMPLE    | b     | index | PRIMARY   | PRIMARY   | 4     |    1  | Using index   |

| SIMPLE    | a     | ALL   | NULL      | NULL      | NULL  |   12  | Using where   |

+----------------+----------+-----------+----------------+----------------+----------+-----------+----------------+

2 rows in set (0.02 sec)

 

select_type:select 类型

table:输出结果集的表

type:表示表的连接类型



①当表中仅有一行是type的值为system是最佳的连接类型;



②当select操作中使用索引进行表连接时type的值为ref;



③当select的表连接没有使用索引时,经常会看到type的值为ALL,表示对该表进行了全表扫描,这时需要考虑通过创建索引来提高表连接的效率。



possible_keys:表示查询时,可以使用的索引列.

key:表示使用的索引

key_len:索引长度

rows:扫描范围

Extra:执行情况的说明和描述

四、确定问题,并采取相应的优化措施

经过以上步骤,基本可以确认问题出现的原因,可以根据情况采取相应的措施,进行优化提高执行的效率。

例如上面的例子,我们确认是对a表的全表扫描导致效率的不理想,我们对a表的year字段创建了索引,查询需要扫描的行数明显较少。

 

mysql> explain select sum(moneys) from sales a,companys b where a.company_id = b.id and a.year = 2006;

+----------------+----------+-----------+----------------+----------------+----------+-----------+----------------+

| select_type   | table | type  | possible_keys| key            | key_len   | rows  | Extra     |

+----------------+----------+-----------+----------------+----------------+----------+-----------+----------------+

| SIMPLE    | b     | index | PRIMARY   | PRIMARY   | 4     |    1  | Using index   |

| SIMPLE    | a     | ref       | year      | year      | 4     |    3  | Using where   |

+----------------+----------+-----------+----------------+----------------+----------+-----------+----------------+

2 rows in set (0.02 sec)

转载:http://see.xidian.edu.cn/cpp/html/1472.html

mysql优化---优化sql的更多相关文章

  1. MySQL 数据库性能优化之SQL优化

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  2. mysql优化-数据库优化、SQL优化

    我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) ...

  3. MySQL 数据库性能优化之SQL优化【转】

    优化目标 减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑, ...

  4. MySQL性能优化方法四:SQL优化

    原文链接:http://isky000.com/database/mysql-performance-tuning-sql 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需 ...

  5. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  6. [sql]大型网站MySQL深度优化揭秘

    大型网站MySQL深度优化揭秘 第1章优化的思路和线路 1.1 网站优化的思路    2 1.2 MySQL优化,nginx这样的东西怎么优化? 第2章硬件层面优化 2.1 数据库物理机 2.1.1 ...

  7. MySQL性能优化(二)-- 数据类型,SQL,八种连接

    一.mysql数据类型优化原则 1. 能够使用最小数据类型存储时,尽量使用最小数据类型存储(前提是要评估字段值的真实数据存储范围) eg:create table aaa(id1 int(10) ze ...

  8. mysql数据库优化课程---14、常用的sql技巧

    mysql数据库优化课程---14.常用的sql技巧 一.总结 一句话总结:其实就是sql中那些函数的使用 1.mysql中函数如何使用? 选择字段 其实就是作用域select的选择字段 3.转大写: ...

  9. mysql实战优化之一:sql优化

    1.选取最适用的字段属性 MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得 ...

  10. mysql优化和sql语句优化总结

    mysql性能优化 1. EXPLAIN 你的 SELECT 查询.使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的.这可以帮你分析你的查询语句或是表结构的性能瓶颈. 2. ...

随机推荐

  1. Storm官方帮助手册翻译(下)

    使用其他语言编写Bolt Bolt可以使用任意语言编写.用另外一种语言编写Bolt来作为子进程运行.Storm会在标准输入输出的基础上使用Json来与子进程通信.通信协议之需要一个100行的适配器库, ...

  2. PHP之Zip扩展,解压缩文件,ZipArchive类

    <?php $zip = new ZipArchive();//新建一个对象 /* $zip->open这个方法第一个参数表示处理的zip文件名. 第二个参数表示处理模式,ZipArchi ...

  3. log4j之mybatis配置

    简单记录一下,配置,因为项目要转向maven架构,所以jar有maven管理,配置完成之后发现原先的sql语句都出不来了,于是搜了一下 mybatis+log4j所需要的依赖如下(我列出我用的版本): ...

  4. and的用法(&)

    经常看到jq的源码中各种&连接在一起赋值一个变量, 例一: var b = a&&a.getName 例二: var b = a&&a.getName||d 例 ...

  5. wpf CollectionViewSource的运用

    实体类: 员工类: public class Department : ObservableCollection<Employee> { public string DepName { g ...

  6. 【转】How to build and install PHP 5.6.9 from source on Ubuntu 14.04 VPS

    原文 https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ In t ...

  7. 关于web.xml的格式

    先是filter  再是<filter-mapping> 然后<servlet> 再是<servlet-mapping> 这是一种规范基于j2ee 在开发的过程中一 ...

  8. oracle中触发器的讲解

    触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...

  9. iOS多线程中performSelector

    下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做一下总结, [delegate imageDownl ...

  10. Trie/Xor

    题目链接 /*有一个数组a1,a2,a3--an.找到一个连续子段[l,r],使得al ^ al+1 ^--^ ar达到最大. 一般思路:维护前缀异或+暴力: for(int i=1;i<=n; ...