【Sql】常见问题列表
死锁
解决思路就是:避免同时操作数据;
首先我们执行show engine innodb status\G;
查看死锁情况,也可以mysql -u root -p --execute="show engine innodb status \G"> c:/mysql.log
把死锁信息输出到本地磁盘,查看起来比较方便
mysql 死锁分析 - 那片天空!那片海! - CSDN 博客
例如:
通过定位死锁的数据库: show engine \G
,发现一个统计任务、一个改价任务,同时修改同一个端口的内容,导致死锁。
解决方法:将两个任务的时间错开,改价的为每分钟的 0 秒触发;统计的为每两分钟的 30 秒触发;
日志文件被删除后,无法正常启动
通过systemctl status mariadb.service
来查看缺少什么文件,创建对应的即可,
如果是权限问题,把外层的文件夹修改下权限 /var/log/mysql
。
然后重启: systemctl restart mariadb.service
Authentication plugin ‘caching_sha2_password’ cannot be loaded
1 | use mysql; |
不可重复读和幻读的区别
- 脏读:读取未提交的数据;
- 不可重复读(update):前后多次读取,数据内容不一致;
- 幻读(insert、delete):前后多次读取,数据总量不一致;
- 快速理解脏读、不可重复读、幻读和 MVCC - 云+社区 - 腾讯云
(1) 不可重复读是读取了其他事务更改的数据,针对 update 操作
解决:使用行级锁,锁定该行,事务 A 多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。
(2) 幻读是读取了其他事务新增的数据,针对 insert 和 delete 操作
解决:使用表级锁,锁定整张表,事务 A 多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。
SELECT IN(子查询)太慢问题
1 | explain SELECT * FROM third_video_iqiyi WHERE v_id in (SELECT v_id FROM third_video_iqiyi WHERE v_id < 10); |
在表的整体数据量大的情况下,上面的 sql 基本无法执行。
优化方案
1 | explain SELECT * FROM third_video_iqiyi a ,(SELECT v_id FROM third_video_iqiyi WHERE v_id < 10) b WHERE a.v_id = b.v_id; |