springboot项目搭建好以后,  金融机构、游戏公

2019-08-16 作者:数据库   |   浏览(159)

查找阻塞进程:

概述

 

索引设计是数据库设计中比较重要的一个环节,对数据库的性能起着至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说“成也索引,败也索引”。在我经历过的,众多的数据库性能问题案例中,80% 系统都存在索引不合理的问题.

 

 

---恢复内容开始---

springboot作为现在十分流行的框架,简化Spring应用的初始搭建以及开发过程,现在我们就使用springboot来进行简单的web项目搭建并对项目sql进行监控。

SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM sys.dm_os_waiting_tasks

为什么需要索引

 

数据在磁盘上是以块的形式存储的。为确保对磁盘操作的原子性,访问数据的时候会一并访问所有数据块。磁盘上的这些数据块与链表类似,即它们都包含一个数据段和一个指针,指针指向下一个节点(数据块)的内存地址,而且它们都不需要连续存储(即逻辑上相邻的数据块在物理上可以相隔很远)。

鉴于很多记录只能做到按一个字段排序,所以要查询某个未经排序的字段,就需要使用线性查找,即要访问N/2个数据块,其中N指的是一个表所涵盖的所有数据块。如果该字段是非键字段(也就是说,不包含唯一值),那么就要搜索整个表空间,即要访问全部N个数据块。

然而,对于经过排序的字段,可以使用二分查找,因此只要访问log2 N个数据块。同样,对于已经排过序的非键字段,只要找到更大的值,也就不用再搜索表中的其他数据块了。这样一来,性能就会有实质性的提升。

举个例子,我们使用微软的示例数据库, 对于下面的查询:

select SalesOrderDetailID FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID=61026

1.SalesOrderDetailID 列没有索引

查询会进行全表扫描。逻辑读如下图:

 

图片 1

表的数据页数如下所示,两者是几乎相等的。说明他对每个数据页都进行需要读取一次。

图片 2

 

2.SalesOrderDetailID 建立索引,逻辑读取仅2次。

因为log2 1246 是等于10.28. 最大的逻辑读取次数是11.

 图片 3

 

1、MySQL概述

项目的搭建就省略了,springboot项目搭建好以后,进行一下操作, 本例子的项目使用 maven 管理的jar

杀死阻塞进程:

利用EXPERT找到缺失索引

 

既然索引对我们如此重要,那么我们如何去快速,方便的找到需要的索引呢。利用体检专家可以轻松做到。

  1.什么是数据库?

1.加入依赖, 在pom.xml文件 增加配置

KILL 57

1.通过执行计划

在执行计划选项卡,对于查询语句,如果存在缺失索引,体检专家会在缺失索引列上打钩,如图所示。

同时列出SQL了 语句执行次数和执行时间。

 图片 4

 

  存储数据的仓库

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.8</version>
</dependency>

2、

配置数据源 ,  在appcation.yml文件加入druid的数据源配置 

# 数据库访问配置
# 主数据源,默认的
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=admin

# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#spring.datasource.useGlobalDataSourceStat=true
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy

3.使用注解的方式,增加druid的过滤器 ,新增一个类 DruidStatFilter.java

import com.alibaba.druid.support.http.WebStatFilter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;


@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*",
    initParams = {
        @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源
    })
public class DruidStatFilter extends WebStatFilter {

}

4.使用注解的方式 增加 DruidStatViewServlet.java 服务类

import com.alibaba.druid.support.http.StatViewServlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

@SuppressWarnings("serial")
@WebServlet(urlPatterns = "/druid/*", initParams = {
    @WebInitParam(name = "allow", value = ""), // IP白名单
    @WebInitParam(name = "deny", value = ""),
    // IP黑名单
    @WebInitParam(name = "loginUsername", value = "admin"), // 用户名
    @WebInitParam(name = "loginPassword", value = "admin*druid"), // 密码
    @WebInitParam(name = "resetEnable", value = "true")})
public class DruidStatViewServlet extends StatViewServlet {

}

5.这里有个很重要的事情一定不要忘了在启动类中加上servlet的扫描注解 

@ServletComponentScan(value = "自己的包")

6.按理说现在druid就搭建好了可以通过http://localhost:8080/druid/index.html进行正常访问了,但是在操作中我发现sql监控并没有起到作用,也就是并没有sql监控的记录,在多次查阅资料后,
终于找到解决办法,虽然我们在配置文件application.properties中已经配置了druid数据源,但是在这里我们需要再次将这个DataSource配置到java配置中,这里我们将这个配置直接写入到启动类中。

@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource druidDataSource() {
   return new DruidDataSource();
}

 

2.通过数据库

在数据库选项卡中,选中缺失索引,体检专家会自动列出数据库中所有的缺失索引。

 

 图片 5

 

 

  2.都有哪些公司在用数据库?

生成脚本

在找到缺失索引后可以通过体检专家自动生成脚本。执行计划中也可以类似的生成脚本。

 

 图片 6

 

图片 7

 

  金融机构、游戏公司、购物网站、论坛网站...

如何建立

 

通过体检专家可以轻松找到系统中缺失的索引。但对于系统中大量的缺失索引,我们如何去选择呢?

  3.提供数据库服务的软件?

1.执行计划中的缺失索引

具体的值,根据业务不同可能有些不同。但是执行次数越多,执行时间越长,影响百分比越大,就越要建立索引。我的建议是:执行次数每天超过200,执行时间超过1000ms,影响百分比超过50%。

 图片 8

    1.软件分类

2.数据库中缺失索引

平均影响百分比越大,平均用户开销越大,用户查找次数越大,那么就越需要建立。

同样给出我的建议值:影响百分比50%,用户开销1,用户查找次数每天200

图片 9

 

      MySQL、Oracle、SQL_Server、DB2、MongoDB、MariaDB

总结

贴图是来自北京某银行系统。系统长时间语句非常多,严重影响前端用户体验。对系统第一轮优化,通过体检专家建立合适的索引后,系统的整体性能提升超过50%以上。

 

 

 文章用到的 Expert FOR SQLSERVER 工具下载链接:

 

 

    2.生产环境中,如何选择使用哪个数据库软件?

      开源:MYSql,Mariadb,MongoDB

      不开源:Oracle,DB2,SQL_Server

    3.公司的类型:

      1.商业数据库:政府部门,金融机构

      2.开源数据库:游戏网站、购物网站、论坛网站.....

  4、MySQL的特点

  1.关系型数据库

    1.关系型数据库特点

      1.数据是以行和列(表格)的形式去存储

      2.表中的每一行叫一条记录,每一列叫一个字段

      3.表和表之间的罗技关联叫关系

    2.示例

      1.关系型数据库存储

        表1  学生信息表

        姓名  年龄  班级

        星矢  25     三班

        水冰月 29    六班

        表2  班级信息表

        班级  班主任  

        三班  大空翼

        六班  松人

      2.非关系型数据库中存储

        {"姓名":"水冰月","年龄":"25"}

    2、跨平台

      可以在Unix,Linux,Windows上运行数据库服务;

    3、支持多种编程语言

本文由小鱼儿玄机30码发布于数据库,转载请注明出处:springboot项目搭建好以后,  金融机构、游戏公

关键词: 小鱼儿玄机30码