最近开发中遇到了使用MySQL,多次开启事务,出现了数据错乱问题,伪代码如下:
begin; # 操作1 begin; # 操作2 rollback;
执行完后出现了操作1的数据真正写入,只有操作2的数据回滚了。在第一个事务没有提交或回滚时,再开启第二个事务时,会自动提交第一个事务。
最近开发中遇到了使用MySQL,多次开启事务,出现了数据错乱问题,伪代码如下:
begin; # 操作1 begin; # 操作2 rollback;
执行完后出现了操作1的数据真正写入,只有操作2的数据回滚了。在第一个事务没有提交或回滚时,再开启第二个事务时,会自动提交第一个事务。
(1)负向条件查询不能使用索引
select * from order where status!=0 and stauts!=1
not in/not exists都不是好习惯
可以优化为in查询:
select * from order where status in(2,3)
(2)前导模糊查询不能使用索引
select * from order where desc like '%XX'
而非前导模糊查询则可以:
select * from order where desc like 'XX%'
SQLAdvisor是由美团点评公司DBA团队(北京)开发维护的SQL优化工具:输入SQL,输出索引优化建议。 它基于MySQL原生词法解析,再结合SQL中的where条件以及字段选择度、聚合条件、多表Join关系等最终输出最优的索引优化建议。目前SQLAdvisor在公司内部大量使用,较为成熟、稳定。
美团点评致力于将SQLAdvisor打造成一款高智能化SQL优化工具,选择将已经在公司内部使用较为成熟的、稳定的SQLAdvisor项目开源,github地址。希望与业内有类似需求的团队,一起打造一款优秀的SQL优化产品。
如果你的SQL语句出现了“MySQL server has gone away”错误,那么很有可能是max_allowed_packet这一项设置的问题。
MySQL通过max_allowed_packet配置项来限制接收的数据包大小,默认一般是1M,也就是说如果你插入的数据超过1M就会出错。
我们可以通过下面的语句查看
show VARIABLES like 'max_allowed_packet';