mysql profiling的使用与sql分析

mysql在5.0.3版本之后添加了profiling来进行性能分析

首先进入数据库

show profiles;

mysql默认是关闭的,也就是OFF

需要设置成1开启,也就是ON,注意设置以后退出窗口之后会还原,要永久生效貌似需要重启mysql才行

查看是否开启:

mysql profiling的使用与sql分析_第1张图片

开启:set profiling=1

mysql profiling的使用与sql分析_第2张图片

在这之后每次执行的sql语句都会被记录。

然后可以查看具体每个sql的具体情况,执行时间、CPU消耗等

添加测试数据测试:

我自己添加了测试100W+的数据,数据内容乱写的。本来想一次添加1000W的,电脑内存不够异常了。

测试数据代码:

@Test
	public void add() {
		java.sql.Connection conn = null;
		java.sql.PreparedStatement pstm = null;
		ResultSet rt = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mypinyu?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false",
					"root", "Goodlan@123");
			String sql = "INSERT INTO sys_operation_log"
					+ "(clazz,function,level,logger,message,create_date,ip,user_id,create_user_name,creater,type) "
					+ "VALUES(?,?,?,?,?,?,?,?,?,?,?)";
			pstm = conn.prepareStatement(sql);
			conn.setAutoCommit(false);
			Long startTime = System.currentTimeMillis();
			Random rand = new Random();
			int a, b, c, d;
			for (int i = 1; i <= 1000000; i++) {
				a = rand.nextInt(10);
				b = rand.nextInt(10);
				c = rand.nextInt(10);
				d = rand.nextInt(10);
				pstm.setString(1, "com.pinyu.system.web.controller.LoginController");
				pstm.setString(2, "login"+i);
				pstm.setString(3, "OPERATING");
				pstm.setString(4, "com.pinyu.system.web.controller.LoginController");
				pstm.setString(5, "xxxxxxxxxx_" + "188" + a + "88" + b + c + "66" + d);
				pstm.setDate(6, new java.sql.Date(System.currentTimeMillis()));
				pstm.setString(7, "171.221.144.197"+"."+a+b+c+d);
				pstm.setString(8, "4");
				pstm.setString(9, "admin"+i);
				pstm.setString(10, "ypp哈哈"+i);
				pstm.setString(11, "OPERATING");
				pstm.addBatch();
			}
			pstm.executeBatch();
			conn.commit();
			Long endTime = System.currentTimeMillis();
			System.err.println("OK,用时:" + (endTime - startTime));
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			if (pstm != null) {
				try {
					pstm.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}
	}

上面一次添加100W数据用了150秒,还能接受。表字段在10个左右

现在查询这张表数据,加上之前添加的测试数据,一共有120W+的测试数据。没有用字段名,直接*查询。看看sql的具体执行情况

执行了sql语句:select * from sys_operation_log where message like '%admin%';

接下来肯定是个漫长的等待过程,没用到索引,全表扫描等,数据量百万级,肯定不会快,等吧,目的主要分析profiles

mysql profiling的使用与sql分析_第3张图片

再次执行命令:show profiles;

mysql profiling的使用与sql分析_第4张图片

4是执行的sql语句

show profile all for query 4查看该sql所有执行信息

mysql profiling的使用与sql分析_第5张图片

里面每一项,网上资料很多这里不一一介绍了。

测试完毕,关闭参数

set profiling=0

退出命令窗口。

你可能感兴趣的:(java,mysql)