记录mysql性能查询过程

一切源于一个实验,请看下面的例子:

表:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

CREATE TABLE IF NOT EXISTS `foo` (

`a` int(10) unsigned NOT NULL AUTO_INCREMENT,

`b` int(10) unsigned NOT NULL,

`c` varchar(100) NOT NULL,

PRIMARY KEY (`a`),

KEY `bar` (`b`,`a`)

) ENGINE=InnoDB;

 

CREATE TABLE IF NOT EXISTS `foo2` (

`a` int(10) unsigned NOT NULL AUTO_INCREMENT,

`b` int(10) unsigned NOT NULL,

`c` varchar(100) NOT NULL,

PRIMARY KEY (`a`),

KEY `bar` (`b`,`a`)

 

) ENGINE=MyISAM;

我往两个表中插入了30w的数据(插入的时候性能差别InnoDB比MyISAM慢)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<?php

 

$host = '192.168.100.166';

 

$dbName = 'test';

 

$user = 'root';

 

$password = '';

 

$db = mysql_connect($host, $user, $password) or die('DB connect failed');

 

mysql_select_db($dbName, $db);

 

echo '===================InnoDB=======================' . "\r\n";

 

$start = microtime(true);

 

mysql_query("SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM foo WHERE b = 1 LIMIT 1000, 10");

 

$end = microtime(true);

 

echo $end - $start . "\r\n";

 

echo '===================MyISAM=======================' . "\r\n";

 

$start = microtime(true);

 

mysql_query("SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM foo2 WHERE b = 1 LIMIT 1000, 10");

 

$end = microtime(true);

 

echo $end - $start . "\r\n";

返回结果:

一次查询就会差别这么多!!InnoDB和MyISAM,赶紧分析分析为什么。

首先是使用explain来进行查看

确定两边都没有使用index,第二个查询查的rows,并且MyISAM的查询rows还比InnoDB少这么多,反而是查询慢于InnoDB!!这Y的有点奇怪。

 

没事,还有一个牛掰工具profile

具体使用可以参考:http://dev.mysql.com/doc/refman/5.0/en/show-profile.html

使用方法简单来说:


1

2

3

4

5

Mysql > set profiling = 1;

 

Mysql>show profiles;

 

Mysql>show profile for query 1;

 

这个数据中就可以看到MyISAM的Sending data比InnoDB的Sending data费时太多了。查看mysql文档

http://dev.mysql.com/doc/refman/5.0/en/general-thread-states.html

 

Sending data

The thread is reading and processing rows for a SELECT statement, and sending data to the client. Because operations occurring during this this state tend to perform large amounts of disk access (reads), it is often the longest-running state over the lifetime of a given query.

 

Sending data是去磁盘中读取select的结果,然后将结果返回给客户端。这个过程会有大量的IO操作。你可以使用show profile cpu for query XX;来进行查看,发现MyISAM的CPU_system比InnnoDB大很多。至此可以得出结论是MyISAM进行表查询(区别仅仅使用索引就可以完成的查询)比InnoDB慢。

 

至于再往下的为什么,我想就需要看源码了..于是,就此打住。

 

附带一篇文章,里面还有status的用法

http://hi.baidu.com/thinkinginlamp/item/8d038333c6b0674a3075a1d3

时间: 2016-05-17

记录mysql性能查询过程的相关文章

记录mysql性能查询过程的使用方法_php实例

一切源于一个实验,请看下面的例子: 表: 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `foo` ( `a` int(10) unsigned NOT NULL AUTO_INCREMENT, `b` int(10) unsigned NOT NULL, `c` varchar(100) NOT NULL, PRIMARY KEY (`a`), KEY `bar` (`b`,`a`) ) ENGINE=InnoDB; CREATE TABLE IF NOT EXI

PHP到MySQL数据查询过程概述

HP层到MySQL层 Php到sql组件层次如下图所示: ext/mysqli和ext/mysql 是客户端的扩展程序库(库函数) ,在客户端脚本层面的扩展库. Mysqli库是mysql库的扩展版本,扩展版本增加了列版定(Bind Column)绑定.PDO (PHP Data Object) 是另外一种面向数据对象的 扩展库.这些扩展库直接面向编程者,而它的底层实现是mysql连接引擎(如mysqlnd和libmysql )(参考 http://bbs.chinaunix.net/threa

mysql性能优化-慢查询分析、优化索引和配置

目录 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询   2索引及查询优化 三.配置优化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)      key_buffer_size 5)      query_cache_size 6)      record_buffer_size 7)      read_rnd_b

MySQL内核月报 2015.01-MySQL · 优化改进· 复制性能改进过程

前言 与oracle 不同,mysql 的主库与备库的同步是通过 binlog 实现的,而redo日志只做为mysql 实例的crash recovery使用.mysql在4.x 的时候放弃redo 的同步策略而引入 binlog的同步,一个重要原因是为了兼容其它非事务存储引擎,否则主备同步是没有办法进行的. redo 日志同步属于物理同步方法,简单直接,将修改的物理部分传送到备库执行,主备共用一致的 LSN,只要保证 LSN 相同即可,同一时刻,只能主库或备库一方接受写请求: binlog的同

ibaties+mysql+java 查询性能问题

问题描述 ibaties+mysql+java 查询性能问题 通过ibaties 访问数据库返回列表给Java list,mysql控制台查询0.004秒 Java代码执行1分钟左右.有些时候 通过mysql管理工具查询几百万数据简单的sql实际看到数据时间是4分钟,系统返回的查询时间时0.002秒这种问题是由于什么引起的.怎样优化此类问题谢谢. 补充一下:不考虑硬件. 解决方案 可能的原因为: 1. 和数据库的IO负载有关: 2. mybatis查询开启了缓存. 针对查询,优化查询使用的索引,

sql性能优化-mysql子查询是否被重复执行?

问题描述 mysql子查询是否被重复执行? 请教!mysql返回固定结果集时,是否被重复执行 例如1:select t.*,(select count(1) from table01) from table01 t; 例如2:select t.*,(select count(1) from table01 t2 where t2.key=t1.key) from table01 t1 ;--像这种嵌套的子查询是会被重复执行的. 疑问:上面例子1中的子查询遍历过程中,都是固定结果集,会被重复执行N

mysql慢查询记录和mysqlbinlog配置教程

mysql可以记录所有查询很慢的记录并把sql语句记录在指定的文件中,也可以通过mysqlbinlog记录添加更新 等记录,也可以通过mysqlbinlog进行数据库还原. mysql慢查询记录 编辑my.cnf文件 linux通常在/etc/my.cnf 或者/usr/local/mysql/etc/my.cnf windows 自己找 在[mysqld]标签在下面加上:  代码如下 复制代码 log-slow-queries=/var/lib/mysql/slow.log #慢日志保存路径,

mysql 随机查询数据与性能分析

比如有一个需求,通过sql语句,返回-5至5的随机整数.如果这一个放在PHP中,则非常简单直接用 <?php print rand(-5,5); ?> 在mysql中,rand函数只能有一个参数. //摘自手册 RAND() RAND(N) 返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0).若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列.   有两个方法可以达成以上效果. 1.新建一个表,里面存着 -5 至 5 之间的数.再利用ord

MySQL性能分析系统

对于MySQL慢查询日志的分析,现已由多种工具来提供:最原始的mysqldumpslow,功能比较齐全的 mysqlsla和percona的 pt-query-digest:以上工具大大提高了DBA来分析数据库的性能效率,减少了过多的猜测过程: 如果能实现定时分析SQL并且进行可视化展示呢? 适用过Query-Digest-UI-master 这个UI插件,在配合 percona的 pt-query-digest工具,只是简单做到一个可视化的结果:如果对于多个服务器的分析,这个表现的就很吃力: