前一段时间接触MySql 服务器,关于查询忧化方面整理,优化主要唯绕几个工具函数 : show profiling  , explain ,  索引 , limit

如果上司抱怨服务器查询太慢,这时候,你可能会说,可能是网络不好,服务器性能太差。给上司一个合理的说法,私底下,是什么原因,心中要有数。从客户端发起http 请求,到服务端后台业务处理,具体到数据库相关。大多数性能问题出现在数据库上。通常会有这样情况,服务器上线之时,性能还不错,半年之后,网站慢的像蜗牛。在这段时间,在大的架构不变情况,变化部份是数据库文件暴增。因此很可能是数据库拖后腿了。

解决办法有许多种:

1.业务重构,简化现有业务。

2.增加数据缓存组件

3.优化现有数据库或表结构

假设现在已经拿到一段sql 语句,如何对这段sql 做常归性能分析呢? MySql 提供一些常用工具。首先 将 sql 语句前加 explain ,  mysql 会打印出查询计划:例如:

explain select * from test limit 1

这里有许多列,具体含义可另行搜索 mysql explain 。 重点部份: type possible_key , key , key_len , ref , rows , extra 。

type 属性:  ALL , INDEX , RANGE , REF , EQ_REF , CONST , 从左往右,表现从差到优。

ALL 表明: 当前查询执行全表扫描, 如果在数据量较大表中执行筛选,  显示全表扫描,表明需要添加索引了。

possible_keys 属性: 例举当前sql 可用索引

key:当前查询实际使用索引 (留意关键字 force index(...)  , ignore index(...))

key_len : 当前使用索引颗粒大小

ref : where 子条件哪些列被索引使用

rows:执行查询过程中,扫描了多少行

extra : 额外做了哪些动作,如 Using temporary , Using index , Using  filesort.

例如: explain select SQL_NO_CACHE * from test where year = 2015 and month = 2  ;

以上示例表明:使用了索引 type: ref  , 其中 possible_keys 枚举了能够使用的索引,key 注明实际使用的索引 , key_len 表明索引长度 10 byte, 该值并不是固定的,本例中使用了复合索引,随着复合索引命中的例数增多,key_len 会变大。 ref : const , const , 表明命中复合索引前两列, 如果是: ref:const , const , const ; key_len 的值是15。

rows: 扫描表的行数 ,  值愈小愈好。 limit 关键字无法影响 rows 大小。

例如: explain select SQL_NO_CACHE  * from test where year = 2015 and month = 2 and date = 20 limit 10

请注意,在末尾加了 limit 10 , 但是 MYSQL 仍然扫描了 136176 行 。

开启 MYSQL 执行耗时统计 :

set profiling = 1 ;

显示最近查询sql  耗时

show profiles ;

显示指定查询详细耗时show profile for query [id]

MySql 性能优化杂记的更多相关文章

  1. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  2. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  3. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  4. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  5. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  6. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  8. MYSQL性能优化的最佳20+条经验

    MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论  131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...

  9. [MySQL性能优化系列]LIMIT语句优化

    1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...

随机推荐

  1. JavaWeb学习总结(十一)--JDBC之批处理

    一.批处理的介绍 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.批处理只针对更新(增.删.改)语句,批 ...

  2. rsync同步完整配置

    一.需求: 1.对于分公司访问一些服务器(如工程图纸服务器),如果通过Internet上的VPN访问总是觉得速度慢,毕竟带宽有限,为了解决此问题,可以两地建立同步镜像服务器,分公司可以访问本地的镜像服 ...

  3. Sqlserver_insert语法

    1. INSERT INTO SELECT 通过 SQL,您可以从一个表复制信息到另一个表.   INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中. 我们可 ...

  4. Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断

    IBM AIX Java 1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852 Name            PID  CPU% java         614852  ...

  5. java 零碎1

    1. java 程序的入口必须是 static 类型的,接口中不允许有 static , 而且接口中的方法必须是public. 2. java 回收主要针对的是堆区的回收. 3. java.exe 是 ...

  6. 基于cfx的webservice调用

    一.简单的(结合Spring) 1.  新建一个web 项目,加入cfx所需要jar 2.  编写要发布的Web Service接口和实现类所需要jar 接口类 HelloWorld : import ...

  7. 【EasyX】RGB to Gray

    code: #include <graphics.h> #include <conio.h> void main() { initgraph(, ); // 读取图片 load ...

  8. [maven] 跳过单元测试

    1.mvn命令 $ mvn install -Dmaven.test.skip=true 2.通过配置pom <project> [...] <build> <plugi ...

  9. postgresql 视图

    一.创建视图 create or replace view vw_users as select * from users; 二.通过定义规则来更新视图 create rule vw_users_up ...

  10. WPF:行列显示

    新建显示病人信息控件PatientElement Add-->NewItem-->WPF-->UserControl(WPF),名称:PatientElement.xmal < ...