打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
UC头条:来,教你写一手好SQL!

MySQL性能

(1)最大数据量

抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。

点击加载图片

《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。

性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。

我曾经操作过超过4亿行数据的单表,分页查询最新的20条记录耗时0.6秒,SQL语句大致是:

selectfield_1,field_2fromtablewhereid<#{prePageMinId}orderbyiddesclimit20

prePageMinId是上一页数据记录的最小ID。虽然当时查询速度还凑合,随着数据不断增长,有朝一日必定不堪重负。

分库分表是个周期长而风险高的大活儿,应该尽可能在当前结构上优化,比如升级硬件、迁移历史数据等等,实在没辙了再分。对分库分表感兴趣的同学可以阅读分库分表的基本思想。

(2)最大并发数

并发数是指同一时刻数据库能处理多少个请求,由max_connections和max_user_connections决定。

max_connections是指MySQL实例的最大连接数,上限值是16384,max_user_connections是指每个数据库用户的最大连接数。

MySQL会为每个连接提供缓冲区,意味着消耗更多的内存。如果连接数设置太高硬件吃不消,太低又不能充分利用硬件。

一般要求两者比值超过10%,计算方法如下:

max_used_connections/max_connections*100%=3/100*100%≈3%

查看最大连接数与响应最大连接数:

showvariableslike'%max_connections%';showvariableslike'%max_user_connections%';

在配置文件my.cnf中修改最大连接数:

[mysqld]max_connections=100max_used_connections=20

(3)查询耗时0.5秒

建议将单次查询耗时控制在0.5秒以内,0.5秒是个经验值,源于用户体验的3秒原则。如果用户的操作3秒内没有响应,将会厌烦甚至退出。

响应时间=客户端UI渲染耗时+网络请求耗时+应用程序处理耗时+查询数据库耗时,0.5秒就是留给数据库1/6的处理时间。

(4)实施原则

相比NoSQL数据库,MySQL是个娇气脆弱的家伙。它就像体育课上的女同学,一点纠纷就和同学闹别扭(扩容难),跑两步就气喘吁吁(容量小并发低),常常身体不适要请假(SQL约束太多)。

如今大家都会搞点分布式,应用程序扩容比数据库要容易得多,所以实施原则是数据库少干活,应用程序多干活:

充分利用但不滥用索引,须知索引也消耗磁盘和CPU。

不推荐使用数据库函数格式化数据,交给应用程序处理。

不推荐使用外键约束,用应用程序保证数据准确性。

写多读少的场景,不推荐使用唯一索引,用应用程序保证唯一性。

适当冗余字段,尝试创建中间表,用应用程序计算中间结果,用空间换时间。

不允许执行极度耗时的事务,配合应用程序拆分成更小的事务。

预估重要数据表(比如订单表)的负载和数据增长态势,提前优化。

数据表设计

(1)数据类型

数据类型的选择原则,更简单或者占用空间更小:

如果长度能够满足,整型尽量使用tinyint、smallint、medium_int而非int。

如果字符串长度确定,采用char类型。

如果varchar能够满足,不采用text类型。

精度要求较高的使用decimal类型,也可以使用BIGINT,比如精确两位小数就乘以100后保存。

尽量采用timestamp而非datetime。

点击加载图片

相比datetime,timestamp占用更少的空间,以UTC的格式储存自动转换时区。

(2)避免空值

MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。

因此尽可能将NULL值用有意义的值代替,也能避免SQL语句里面包含isnotnull的判断。

(3)Text类型优化

由于Text字段储存大量数据,表容量会很早涨上去,影响其他字段的查询性能。建议抽取出来放在子表里,用业务主键关联。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何写得一手好SQL ?
升级mysql
怎么查看和修改 MySQL 的最大连接数? | Lugir
盘点那些被问烂了的 Mysql 面试题 | Laravel China 社区
MySQL在大数据、高并发场景下的SQL语句优化和''''最佳实践''''
Mysql某个表有近千万数据,CRUD比较慢,如何优化?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服