记录mysql性能查询过程的使用方法_CentOS_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • CentOS

    当前位置:主页 > 服务器教程 > CentOS >

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

    时间:2019-07-10|栏目:CentOS|点击:
  • 一切源于一个实验,请看下面的例子:

    表:
    复制代码 代码如下:
    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慢)
    复制代码 代码如下:
    <?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

    使用方法简单来说:

    复制代码 代码如下:
    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慢。

    责任编辑:自由哥

    上一篇:Mysql中分页查询的两个解决方法比较

    栏    目:CentOS

    下一篇:基于MySQL分区性能的详细介绍

    本文标题:记录mysql性能查询过程的使用方法

    本文地址:http://www.jh-floor.com/fuwuqijiaocheng/CentOS/2017.html

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号