show profile功能
开启 Show Profile 功能,默认该功能是关闭的,使用前需开启。show variables like 'profiling'; set profiling = on; ## 执行一部分sql后(默认保留15条) show profiles; ## duration是持续时间 ## 针对特定的sql进行诊断 show profile cpu,block io for query Query_ID;/*Query_ID为#3步骤中show profiles列表中的Query_ID*/
show profile 的常用查询参数。
①ALL:显示所有的开销信息。
②BLOCK IO:显示块 IO 开销。
③CONTEXT SWITCHES:上下文切换开销。
④CPU:显示 CPU 开销信息。
⑤IPC:显示发送和接收开销信息。
⑥MEMORY:显示内存开销信息。
⑦PAGE FAULTS:显示页面错误开销信息。
⑧SOURCE:显示和 Source_function,Source_file,Source_line 相关的开销信息。
⑨SWAPS:显示 ...
union和union all 关键字
区别 1:取结果的交集
union: 对两个结果集进行并集操作, 不包括重复行,相当于 distinct, 同时进行默认规则的排序;
union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;
区别 2:获取结果后的操作
union: 会对获取的结果进行排序操作
union all: 不会对获取的结果进行排序操作
区别 3:
union 看到结果中 ID=3 的只有一条select * from student2 where id < 4unionselect * from student2 where id > 2 and id < 6
union all 结果中 ID=3 的结果有两个
select * from student2 where id < 4union allselect * from student2 where id > 2 and id < 6
总结
union all 只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用 union all 的 ...
主从复制的搭建
#
做主从的前提
两台服务器的防火墙都开放了各自 mysql 的服务端口(下面以默认的 3306 为例子)
从库无法同步主库之前的数据。如果主库之前有数据,那么先把主库的数据导入到从库中。保证两台服务器在做主从复制之前的数据一致性
尽量保证两台服务器的 my.cnf 文件只有 server-id 不同。其他的配置都相同
修改主服务器的配置
vi /etc/my.cnf
[mysqld]# 启用主从配置(主服务器)# 主服务器idserver-id=1# 二进制日志log-bin=mysqlbin# 设置忽略复制的数据库# binlog-ignore-db=mysql# 设置需要复制的数据库# binlog-do-db=dtjc
重启 mysql 服务器
service mysqld restart
mysqld 无效的话把 mysqld 换成 mysql
运行
mysql> show master status;+-----------------+----------+--------------+------------------+---------------- ...
锁
myisam 的读写锁(表锁)lock table emp read;lock table emp write;
myisam 是写锁调度优于读锁调度,所以 mysiam 要偏读(因为写会阻塞其他线程对当前表的任何操作)
myisam 执行 select 时会给所有涉及的表增加读锁。执行增删改时会给所有涉及到的表增加写锁
表读锁,当前 session 只能读当前表,对其他表任何操作都做不了,其他 session 能做任何操作,只是对有读锁的表的增删改会阻塞
表写锁,当前 session 只能对当前表做增删改查,对其他表任何操作都做不了,其他 session 对有写锁的表的任何操作都会堵塞,但是对其他的表可以做任何操作
show open tables; --查看哪些表被锁了show status like 'table%'; --分析表的锁定状况
innodb 的读写锁(行锁)session1 更新某一行时,且未提交。session2 读到的是旧数据。直到 ession1 提交。session2 才能读到新数据
session1 更新某一行时,且未提交。当 ses ...
区间查询
取交集的区间查询两个区间段只要有交集就查出来
<if test='(startTime != "" and startTime != null) and (endTime == null or endTime == "")'> AND csrw.endtime >= #{startTime}</if><if test='(startTime == "" or startTime == null) and (endTime != null and endTime != "")'> AND csrw.createtime <= #{endTime}</if><if test='(startTime != "" and startTime != null) and (endTime != null and endTime != ...
开放远程连接
5.7先连接到本地数据库
切换到 mysql 数据库
use mysql
使用以下命令可以更改远程连接的设置
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
刷新权限
flush privileges;
查询 user 表看看是否生效,如果 ‘%’ ‘root’ 在第一行证明生效了
select host,user from user;
比较date或者datetime
单个的比较可以直接使用> < 或者= 来比较,但是当两个值的组合与另两个值的组合进行比较的时候,可以使用UNIX_TIMESTAMP()函数
SELECT *FROM dtjc_jh_jdjhWHERE xm_id = #{xmId}ORDER BY (UNIX_TIMESTAMP( start_time ) + UNIX_TIMESTAMP( end_time ))/ 2;
如上就是根据起始时间和终止时间的中间值进行比较。其中 start_time 和 end_time 都是 datetime 类型
查询时别名
在 mysql 中
group by ,having ,order by 支持字段的别名。group by ,order by 后使用别名select case when t.author_level in(1,2) then '1-2级' when t.author_level in(3,4) then '3-4级' when t.author_level in(5,6) then '5-6级' else '' end as level_cnt, count(s.issue_id) as numfrom author_tb t join answer_tb s on t.author_id = s.author_idwhere s.char_len >= 100group by level_cntorder by num desc
where 后面不支持字段的别名。
如果关联查询的时候给表起了别名。那么 where 后面如果 ...
索引
什么情况下要用索引
主键自带主键索引
唯一约束自带唯一索引
外键自带外键索引
查询条件用到的字段需要
排序用的的字段
分组用到的字段
什么情况下不能用索引
数据量较少时不用建索引。
频繁更新字段不能建索引
索引的选择性(字段的值尽量复杂且尽量分布不平均)
where 条件查询用不到的字段不用建索引
mysql 优化索引十诫(附口诀)
全值匹配我最爱
最佳左前缀法则(如果索引引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列)
不在索引列上做任何操作(计算,函数,(自动 or 手动)类型转换),会导致索引失效而转向全表扫描
存储引擎不能使用索引中范围条件右边的列
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 select *
mysql 在使用!=或者<>时候无法使用索引而转向全表扫描
is null,is not null 也无法使用索引
like 以通配符开头(‘%abc’)mysql 索引失效会变成全表扫描的操作。解决办法:使用覆盖索引
字符串不加单引号导致索引失效
少用 or,用 or 连接时会索引失 ...
and() 和 or()的嵌套使用
and 里面嵌套 or 如下使用
QueryWrapper<ErrorData> ew = new QueryWrapper<>();ew.eq("dcjh_id", csrwInfo.getCsrwID()).and(wrapper -> wrapper.eq("wtlx", "0").or().eq("wtlx", "1"));// where dcjh_id = '' and (wtlx = '0' or wtlx = '1'),注意:这里是一个lambda表达式List<ErrorData> dataList = errorDataService.list(ew);
使用QueryWrapper关于时间日期比较的问题
首先明确。springmvc 默认不支持将前台传过来的日期/日期时间字符串在到达 controller 层之前直接转成 Date/LocalDate/LocalDateTime 类型的,所以接收还是要用字符串类型接收
mp 的条件构造器不支持时间日期字符串与 mysql 的 date/datetime 类型的字段的比较
所以在比较的时候。要这么写
//query:startDate->String,endDate->String,例子:2020-08-01//jcrq:mysql->date类型的// 应该同样适用2020-08-01 08:00:00的字符串和mysql中datetime类型的比较// 可以这么理解。统一转成时间戳再进行比较QueryWrapper<TSjfxJcjl> qw = new QueryWrapper<>();qw .apply(!StringUtils.isEmpty(query.getStartDate()), "UNIX_TIMESTAMP(jcrq) >= UNIX_TIM ...
将普通项目托付给maven管理
如需将一个 java 项目托付给 maven 管理。在项目的根目录下,建个 pom.xml 把以下内容复制进去。同时右键把该项目标记为 maven 项目(不同的 idea 版本该操作的名称可能不一样)
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--组id--> <g ...
在maven库上添加手动添加第三方jar包
进入到放这个 jar 包的文件夹,运行 cmd
然后根据下面的例子手动自己可以尝试着添加
mvn install:install-file -Dfile=aspose-words-16.4.0-jdk16.jar -DgroupId=com.aspose.word -DartifactId=aspose.words -Dversion=16.4.0-jdk16 -Dpackaging=jar -DgeneratePom=true
<dependency> <groupId>com.aspose.word</groupId> <artifactId>aspose.words</artifactId> <version>16.4.0-jdk16</version></dependency>
自带的分页插件的使用
建一个 page 对象传入前台的 page,和 limit 参数(推荐使用泛型,限定返回的参数类型,例子的话应该是 Page\)
调用 dao 或者 service 层时传入 page 对象
Page pages = new Page(Integer.valueOf(page), Integer.valueOf(limit));List<Map> list = dtjcXmGeneralreportService.getCxList(pages, csrwId,xlId,xb,ppbzId,Integer.valueOf(topSpeed));
service 接口层
List<Map> getCxList(Page pages, String csrwId, String xlId, String xb,String bz,Integer topSpeed);
service 层
@Override public List<Map> getCxList(Page pages, String csrwId, String xlId, String x ...
项目打成jar包时,将项目下的文件,以及所有的依赖打成一个jar包
例子:在做一个单机的用 maven 管理的 swing 项目时,引入了 poi,但是打成的 jar 包里没有 poi 的依赖,导致用 exe4j 转换出的 exe 程序报错(Caused by: java.lang.NoClassDefFoundError)
这种错误就是没有将依赖打包进去导致的,所以最好打包成单个 jar 包。
解决办法:在 maven 里加入以下插件
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration></plugin>
在项目的根目录下执行(在执行以下任意操作前别忘了 clean。清除以前的 target 文件夹)mvn assembly:as ...
项目的jar包都正常引用了,但是build时就是提示jar包不存在的解决办法
如题,编译和打包都是正常的,pom 文件中依赖存在并且没有报错。找到相应包的引用位置,也能正常访问包中的内容。而且提示的一般都是基础的 jar 包找不到,比如单元测试用到的 jar 包等。。。
情形一:
其他同事提交代码时把 idea 中的 .iml 文件也一起提交了,该文件中配置的 jdk lib 路径与自己电脑中的该路径不一致。
解决方法很简单,执行一下 maven update 即可,也可以手动修改 .iml 文件中的该路径。
情形二:
排除情形一出现的原因,或使用情形一中的方法解决无效时,可以使用以下命令更新不完整依赖:
mvn -U idea:idea
需要注意的是,该命令使用的插件早在 13 年就已经停止维护,所以有可能出现各种问题,比如我遇到过的空指针异常。
情形三:
使用情形二中的方法解决无效时,可以使用以下方法再次尝试
ctrl + alt + shift + s 或 在界面菜单选择 File —> Project Structure
点击 Libraries 找到提示不存在的 jar 包(这里以 junit 为例),选中,然后右键打开菜单,选择 Conver ...
mybatis中$和#的使用场景
group by 字段 ,order by 字段,表名,字段名,如果是动态的用$
limit 用#
其他的用#
传入集合循环查询并用union组合
实例:接口
/** * selectOverrunData:查询一个单次计划某个行别某个速度级下各个超限类型的占比 * * @param testTaskId 测试任务id * @param xb 行别 * @param speedLevel 速度级 * @param type 超限还是大值 * @param labelList 通道名称集合 * @return * @author Zhangyuhan * @date 2021/7/8 15:03 */ List<Map<String, Object>> selectStatisticalInformation(@Param("testTaskId") String testTaskId, @Param("xb") String xb, ...
批量插入大数据
思路分析批量插入这个问题,我们用 JDBC 操作,其实就是两种思路吧:
用一个 for 循环,把数据一条一条的插入(这种需要开启批处理)。
生成一条插入 sql,类似这种 insert into user(username,address) values(‘aa’,‘bb’),(‘cc’,‘dd’)…。到底哪种快呢?
我们从两方面来考虑这个问题:
插入 SQL 本身执行的效率。
网络 I/O。
先说第一种方案,就是用 for 循环循环插入:
这种方案的优势在于,JDBC 中的 PreparedStatement 有预编译功能,预编译之后会缓存起来,后面的 SQL 执行会比较快并且 JDBC 可以开启批处理,这个批处理执行非常给力。
劣势在于,很多时候我们的 SQL 服务器和应用服务器可能并不是同一台,所以必须要考虑网络 IO,如果网络 IO 比较费时间的话,那么可能会拖慢 SQL 执行的速度。
再来说第二种方案,就是生成一条 SQL 插入:
这种方案的优势在于只有一次网络 IO,即使分片处理也只是数次网络 IO,所以这种方案不会在网络 IO 上花费太多时间。
当 ...
判断字符串相等时的注意事项
mybatis 映射文件中,if 标签判断字符串相等,两种方式:
因为 mybatis 映射文件,是使用的 ognl 表达式,所以在判断字符串 sex 变量是否是字符串 Y 的时候,
<if test="sex=='Y'.toString()"><if test = 'sex== "Y"'>
注意:不能使用
<if test="sex=='Y'">and 1=1</if>
因为 mybatis 会把’Y’解析为字符,所以不能这样写 会报 NumberFormatException
MyBatis 是使用的 OGNL 表达式来进行解析的,这个地方有一个坑需要注意下,单引号内有一个字符的情况下,OGNL 会将其以 java 中的 char 类型进行解析,那么此时 char 类型与参数 String 类型用等号进行比较的时候结果都是 false。解决方案也很简单,就是讲 test 中的单个字符用双引号括起来。
<wher ...