什么是Druid?
Druid是一个高效的数据查询系统,主要解决的是对于大量的基于时序的数据进行聚合查询。数据可以实时摄入,进入到Druid后立即可查,同时数据是几乎是不可变。通常是基于时序的事实事件,事实发生后进入Druid,外部系统就可以对该事实进行查询。
Druid采用的架构:shared-nothing架构与lambda架构
Druid设计三个原则:
1.快速查询:部分数据聚合(Partial Aggregate) + 内存华(In-Memory) + 索引(Index)
2.水平拓展能力:分布式数据(Distributed data)+并行化查询(Parallelizable Query)
3.实时分析:Immutable Past , Append-Only Future
Druid是一个JDBC组件,包括三部分:
- DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。
- DruidDataSource 高效可管理的数据库连接池。
- SQLParser
Druid可以做什么?
-
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
-
数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
-
SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
SpringBoot连接Mysql
Step1:Mysql驱动以及Druid连接池配置
server:
port: 8091
#=========================数据库连接=========================================
druid:
allow:
ip: 127.0.0.1
login:
username: root
password: root
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/educationapp?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
#初始化大小
initial-size: 1
#最小线程数
min-idle: 1
#最大线程数
max-idle: 5
max-wait-millis: 60000
timeBetweenEvictionRunsMillis: 60000
# 配置⼀个连接在池中最⼩⽣存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: true
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的⼤⼩
poolPreparedStatements: false
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界⾯sql⽆法统计,'wall'⽤于防⽕墙
filters: stat,wall
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#spring.datasource.useGlobalDataSourceStat=true
Step2:启动SpringBoot项目浏览器访问控制台
访问:localhost:端口/druid
输入yml文件配置的用户名和密码,我配置的全是root
随便写了个接口,调用可以看到Session监控的访问ip以及请求次数、并发执行数等
Step3:SQL执行效率查询
Step3.1:写了一个新增的接口方法,先写入10万条数据
这里有个题外话和大家说一下。比如你某些字段比如code这种值一般作为一些唯一性码的存在,但你数据量越来越多它一定会出现重复的情况,而且UUID生成是有规律的,前缀一般都是两个0或者三个0。很大概率发生数据冲突,UUID与机器码和本地MAC值有关。所以建议大家后面可以跟上时间戳
Step3.2:生成后的10万数据
Step3.3:写一个条件查询code数据
Step3.4:调用接口查看druid监控
可以看到最慢也只有100毫秒,主要还是数据太少的原因
以上数据库字段是没加索引的情况,下面我来将code字段加上唯一索引
重启后台,以及更换code条件值,主要是防止缓存
可以看到下面结果,最慢只有4毫秒,这是非常显著的提升
也可以发现druid还是非常好用,可以帮助我们查看慢SQL以及名中并发等。