MySQL数据库常见问题
大量数据导入数据的方式
- 批量新增修改案例注意问题:
1
2
3
4
5
6
7
8
9
10
11
12<insert id="insertOrUpdateBatch">
insert into user(uid,name,age)
values
<foreach collection="list" item="item" separator=",">
(#{item.uid},#{item.name},#{item,age})
</foreach>
on duplicate key update
uid= values(uid)
name=values(name),
age=values(age)
</insert>
XML拼接SQL语句的方法,会不会导致语句超长报错
优化方式
用preparestatement多线程批量处理,8线程1000w只需要1分钟
库一般每秒写入三百兆数据没问题,实际情况
mybatisplus的savebatch其实加上rewriteBatchedStatements的配置就不是一条一条执行的了,底层会走到jdbc的批处理,而jdbc的批处理毋庸置疑已经做过优化了,其实和原生sql语句性能没差多少,而原生sql还有语句太长报错的可能。
1 常见SQL 问题
1.1 SQL索引问题
疑问:
1. 为什么SQL会走错索引?
2. 为什么SQL走这个索引, 不走那个索引?
3. 为什么有索引不走, 走全表扫描?
4. SQL是依据什么判断走哪个索引的?
1.2 2.存储过程
https://blog.csdn.net/whf_a/article/details/114871866
1 | -- 创建存储过程 |
1.3 清理binlog日志的方法
查看binlog过期时间
show variables like 'expire_logs_days';
expire_logs_days=0:
这里的值如果为0,表示所有binlog日志永久都不会失效,不会自动删除;
这里的值如果为30,表示只保留最近30天。修改binlog过期时间
永久生效(重启后即生效)
修改配置文件my.cnf文件: vim /etc/my.cnf清除binlog日志:
1
2
3
4
5-- 比如将mysql-bin.009560之前的binlog清掉:
purge binary logs to 'mysql-bin.009560';
-- 指定时间之前的binlog清掉:
purge binary logs before '2022-01-01 23:59:59';
2 数据库表设计
2.1 全文索引
2.1.1 表结构
1 | CREATE TABLE `work_order_query` ( |
2.1.2 添加全文索引
1 | ALTER TABLE `work_order_query` |
2.1.3 生成数据
1 | DELIMITER $$ |
2.1.4 查询方式
如果 system_names 列存储了多个系统名称(如逗号分隔的系统名称列表),并且你希望查询多个系统名称,你可以使用 MATCH ... AGAINST 查询来查找包含多个系统名称的记录。我们可以将多个系统名称通过布尔查询的方式进行组合。
2.1.4.1 查询多个系统名称
假设你要查询涉及 System1 和 System2 的工单,可以通过以下方式进行查询:
1 | SELECT * FROM `work_order_query` WHERE MATCH (`system_names`) AGAINST ('+System1 +System2' IN BOOLEAN MODE); |
解释:
+System1 +System2:在布尔模式下,+符号表示必须包含System1和System2。IN BOOLEAN MODE:布尔模式搜索,允许你使用布尔运算符(如+表示必须包含,-表示排除某些词)。
xml形式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<mapper namespace="com.example.mapper.WorkOrderQueryMapper">
<!-- 查询多个系统名称都包含 -->
<select id="selectOrdersWithAllSystems" resultType="com.example.model.WorkOrderQuery">
SELECT * FROM work_order_query
WHERE MATCH (system_names) AGAINST
<foreach collection="systemNames" item="systemName" separator=" " open="'(" close=")'">
+#{systemName}
</foreach>
IN BOOLEAN MODE
ORDER BY created_at DESC
</select>
</mapper>
2.1.4.2 查询任意一个系统名称
如果你希望查询包含任意一个系统名称的工单(比如包含 System1 或 System3),可以使用以下查询:
1 | SELECT * FROM `work_order_query` WHERE MATCH (`system_names`) AGAINST ('System1 System3' IN BOOLEAN MODE); |
这个查询将返回包含 System1 或 System3 的工单。
1 | <mapper namespace="com.example.mapper.WorkOrderQueryMapper"> |
2.1.4.3 查询多个系统名称,且指定一个或多个系统名称必须包含
假设你要查询包含 System1 或 System2,并且同时包含 System3 的工单,可以使用以下查询:
1 | SELECT * FROM `work_order_query` WHERE MATCH (`system_names`) AGAINST ('+System3 +System1 +System2' IN BOOLEAN MODE); |
这样查询的结果将会包含所有同时涉及 System1、System2 和 System3 的工单。
1 | <mapper namespace="com.example.mapper.WorkOrderQueryMapper"> |
2.1.4.4 查询多个系统名称的任意组合
如果查询需要找到包含某些系统名称的组合,且你不关心顺序,只要包含这些系统名称即可。你可以使用 MATCH ... AGAINST 和 OR 语法组合:
1 | SELECT * FROM `work_order_query` WHERE MATCH (`system_names`) AGAINST ('System1 OR System2 OR System3' IN BOOLEAN MODE); |
1 | <mapper namespace="com.example.mapper.WorkOrderQueryMapper"> |
2.1.4.5 总结:
- 使用布尔模式(
IN BOOLEAN MODE)可以根据需要查询多个系统名称。 +表示必须匹配的词,OR表示任意匹配一个词,-表示排除某个词。- 使用
MATCH ... AGAINST可以高效地在包含多个系统名称的system_names字段中进行查询。
这种查询方式适用于system_names存储多个系统名称的场景,并且能够支持灵活的查询条件。



