MySQL性能调优

哎呀,说实话,我们来谈谈 MySQL 调优吧。
去年我在阿里云上做一个项目的时候,数据库差点崩溃了,但是我靠着一些技巧才挽救了它。

先说最关键的,分库分表。
用户量一增加,就出现了一个订单表,直接达到了8 00万行,我们查看页面的时候,就卡住了。
后来我们实现了垂直分离,把用户信息和产品信息分开。
订单表变得更加干净。
你相信这个伎俩吗?那年我举办一个活动时,并发请求的数量增加了一倍。
如果没有专门的桌子,我肯定会遇到麻烦。

在SQL中,不要盲目OR。
一年前的一个项目。
查询条件是OR,结果索引完全没用。
切换到 UNIONALL 速度快三倍。
而且分页的话,不要用LIMIT N,M,我当时就用过,但是客户抱怨每次查的时候都慢。
后来改成了分页三法,使用子查询,速度快多了。

索引确实是一项技术工作。
我见过人们构建了数百个索引,但写入操作挂起。
您必须能够阅读 EXPLAIN。
去年有一个年轻同事创建了一个索引,结果是类型是lek。
查了一下,发现索引并没有消失。
你应该记住最左边的前缀原则。
我是一步步学会的。

表结构也需要挖出来。
去年,有一个表使用了 CHAR 字段。
结果存储一半就用完了,还是慢。
后来全部改成了VARCHAR,这样节省了空间,查询也更快了。
不要在数据库中存储大文件。
我见过人们将数千 KB 的图像保存到数据库中,但备份失败。

调优是一项实际工作,应该与您的业务结合起来。
例如,对于慢查询日志,您应该设置适当的阈值。
我有一个客户把门槛定得太低。
结果,记录了数百毫秒,导致系统随机报警。
后来调整到两秒就正常了。

最后,说实话,监控非常重要。
我有一个项目,数据库关闭了几个小时而未被检测到。
运维组随后在半夜查看监控系统一探究竟。
因此,应该使用慢查询日志和性能监控工具。

如何在MySQL中正确处理布尔类型数据

MySQL 布尔类型是 TINYINT(1 )。
0代表假,1 代表真。

建表时直接使用TINYINT(1 )定义字段。
例如:
sql 创建表用户( ID INT 自动递增主键, is_activeTINYINT(1 ) );
存储数据时,如果为真则写入 1 ,如果为假则写入 0。
像这样:
sql 插入用户(is_active)值(1 );
检查数据时,使用等号进行过滤。
例如,检查所有活动的:
sql 从用户中选择 where_active=1 ;
更改数据时,也写入 1 或 0。
make bob inactive:
sql 更新用户设置 is_active = 0 WHERE name = 'Bob';
删除数据时,使用条件过滤。
删除所有不活动的:
sql 从用户中删除 where_active=0;
可以设置一个默认值,比如默认禁用:
sql is_active TINYINT(1 ) 默认 0
MySQL 8 .0及以上版本可以添加CHECK约束,保证只能存储0或1 :
sql is_active TINYINT(1 ) 检查(is_active IN(0,1 ))
ORM 框架通常会自动处理这种转换。
你的例子没有什么问题。

mysql如何实现订单状态管理

严格来说,MySQL 有四个元素来管理订单状态:表结构;状态转移;以及数据一致性和并行更新。
这个问题从时间上来说是很复杂的。

我们先来说说最重要的表结构设计。
标准做法是使用 TINYINT 来存储状态代码和注释。
去年我们做的一个电商项目中直接使用了字符串存储。
上次我检查订单时,它们都关闭了。
用行话来说,这称为雪崩效应。
事实上,前面的一个小延迟会影响后台的所有内容。
另一件事是你需要跟上指标。
idx_status 单独构建状态索引,idx_user_status 构建 user_id+status 索引。
去年双十一;没有用户+状态检查索引的表被破坏。
很多人并不关心这个。
还有一个更重要的细节。
不要忘记在 Status 字段中输入 DEFAULT 1 ;否则,新命令将默认为 NULL 并会引发错误。

一开始我以为使用触发器来控制状态流就足够了,但后来我意识到我错了。
当业务发生变化时,硬编码的触发器很容易更改。
WHERE 在应用层验证资源状态直接使用子句更加灵活。
例如, if ($order->status == 1 ) { $order->status = 2 ; $订单->保存(); } 到一个简单、坚固且有效的支付界面。

等一下,还有一个。
我们不能抛下我们的事。
去年,我有一个项目在更新库存和订单状态时遇到问题。
结果支付成功但是订单没有变化。
用户投诉至死。
整个过程(状态更改+订阅减少+记录写入)必须打包在程序中的启动事务中。
还有同步更新。
扫描时必须输入定时订单以进行更新。
去年,我们使用计划任务重复解锁同一个订单并取消了3 000次。
老实说,这很尴尬。

最后通知:并行更新期间,如果订单状态被其他进程改变。
您计划的工作将继续以其旧状态运行,这可能会导致重复操作。
建议使用版本号或时间戳+重试来检查状态。

mysql查看表结构命令详解 mysql查看表结构字段类型方法

结论: 1 . DESCRIBE/DESC:由于缺乏深入的配置,快速查看您的基础设施。
2 . SHOWCOLUMNSFROM:灵活的过滤字段,例如特定前缀。
3 、SHOWCREATETABLE:综合进行表结构理解、表复制、字符集检查、索引分析等。
4 . INFORMATION_SCHEMA.COLUMNS:灵活的属性过滤、批量查询和数据字典创建。
5 . 仅仅描述是不够的。
它缺乏存储引擎、字符集和复杂索引等深入信息。
6 . 设计数据类型:选择最小的类型,平衡存储和性能,并预测增长和查询。