网易首页 > 网易号 > 正文 申请入驻

mysql性能优化总结详解:MySQL数据库从原理到高性能实战

0
分享至

MySQL数据库作为目前流行的数据库大量应用于PHP、JAVA、Python等Web语言开发项目中,大多数情况下,数据库的操作性能成为整个应用的性能瓶颈。数据库的性能是程序员需要去关注的事情,当设计数据库表结构以及操作数据库(尤其是查询数据时),都需要注意数据操作的性能。

一、优化目标

1、减少 IO 次数

IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。

2、降低 CPU 计算

除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by,group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU计算也就成为了我们 SQL 优化的重要目标。

MySql查询过程

二 优化方法

1.SQL语句优化

明确了优化目标之后,我们需要确定达到我们目标的方法。对于SQL语句来说,达到上述2个优化目标的方法其实只有一个,那就是改变SQL的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到“减少IO次数”和“降低CPU计算”的目标。

1)尽量少 join

MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在Join这方面所下的功夫还不够,所以性能表现离Oracle等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。

2)尽量少排序

3)排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的响应时间。

4)尽量避免 select *,并尽量用join代替子查询

5)尽量少使用“or”关键字

当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

6)尽量用 union all 代替 union

union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

7)避免类型转换

8)能用DISTINCT的就不用GROUP BY

9)尽量不要用SELECT INTO语句

10)从全局出发优化,而不是片面调整

SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有的 SQL,尤其是在通过调整索引优化 SQL的执行计划的时候,千万不能顾此失彼,因小失大。

2.表结构优化

由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。

数据类型选择

原则是:数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率;字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。

1)数字类型:非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。

2)字符类型:定长字段,建议使用 CHAR 类型(char查询快,但是耗存储空间,可用于用户名、密码等长度变化不大的字段),不定长字段尽量使用 VARCHAR(varchar查询相对慢一些但是节省存储空间,可用于评论等长度变化大的字段),且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。

3)时间类型:尽量使用TIMESTAMP类型,因为其存储空间只需要DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。不建议通过INT类型类存储一个unix timestamp 的值,因为这太不直观,会给维护带来不必要的麻烦,同时还不会带来任何好处。

4)ENUM &SET:对于状态字段,可以尝试使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。

字符编码

字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。

尽量使用 NOT NULL

NULL 类型比较特殊,SQL 难优化。虽然 MySQL NULL类型和 Oracle 的NULL有差异,会进入索引中,但如果是一个组合索引,那么这个NULL 类型的字段会极大影响整个索引的效率。虽然 NULL空间上可能确实有一定节省,倒是带来了很多其他的优化问题,不但没有将IO量省下来,反而加大了SQL的IO量。所以尽量确保 DEFAULT 值不是 NULL,也是一个很好的表结构设计优化习惯。

3.架构优化

分布式和集群化

1)负载均衡。负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作、共同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。MySQL一般部署的是高可用性负载均衡集群,具备读写分离,一般只对读进行负载均衡。

2)读写分离。读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。

3)数据切分。通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力。

4.其他优化

1)适当使用视图加速查询。把表的一个子集进行排序并创建视图,有时能加速查询(特别是要被多次执行的查询)。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

2)算法优化。尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。

3)封装存储过程。经编译和优化后存储在数据库服务器中,运行效率高,可以降低客户机和服务器之间的通信量,有利于集中控制,易于维护。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
新春走基层|婺源“刀客”的春天:慢雕时光,顺时而兴

新春走基层|婺源“刀客”的春天:慢雕时光,顺时而兴

新华社
2026-02-13 10:13:12
欧盟峰会一幕:梅洛尼离开时冻得瑟瑟发抖,边走边说“太冷了,冻死我了”

欧盟峰会一幕:梅洛尼离开时冻得瑟瑟发抖,边走边说“太冷了,冻死我了”

环球网资讯
2026-02-14 09:30:12
美团2025年预计亏损超200亿,若美团倒闭,3大影响将很快发生!

美团2025年预计亏损超200亿,若美团倒闭,3大影响将很快发生!

艺利森
2026-02-14 09:22:53
杨幂抢C位风波后,参加新活动,强颜欢笑冷脸周深,面相变狠了

杨幂抢C位风波后,参加新活动,强颜欢笑冷脸周深,面相变狠了

银河史记
2026-02-14 15:50:15
广州男子买菜偶遇双脚被截断乞丐,这竟是失踪12年的同学。

广州男子买菜偶遇双脚被截断乞丐,这竟是失踪12年的同学。

南权先生
2026-02-13 15:26:13
418米!浙江最高楼,即将“破土而出”

418米!浙江最高楼,即将“破土而出”

GA环球建筑
2026-02-14 22:29:11
东契奇:詹姆斯41岁还这样太疯狂了,他的职业态度激励了我

东契奇:詹姆斯41岁还这样太疯狂了,他的职业态度激励了我

懂球帝
2026-02-15 00:37:28
揪心!谷爱凌脑出血休克,癫痫发作濒死边缘,母亲泪崩曝细节

揪心!谷爱凌脑出血休克,癫痫发作濒死边缘,母亲泪崩曝细节

古事寻踪记
2026-02-06 07:13:45
广东飞踹拾荒老人后续:知情人曝出更多内幕,老人现在的情况不好

广东飞踹拾荒老人后续:知情人曝出更多内幕,老人现在的情况不好

离离言几许
2026-02-14 11:03:13
委内瑞拉代总统以叛国罪、间谍罪、泄露国家机密,以及失职等罪名

委内瑞拉代总统以叛国罪、间谍罪、泄露国家机密,以及失职等罪名

百态人间
2026-02-13 15:06:54
谢贤前女友又曝猛料!谢霆锋娶张柏芝并不是因为爱她,隐瞒所有人

谢贤前女友又曝猛料!谢霆锋娶张柏芝并不是因为爱她,隐瞒所有人

洲洲影视娱评
2026-02-12 12:26:45
大学女老师出轨学生:开房使用工具助兴,高颜值照流出,细节曝光

大学女老师出轨学生:开房使用工具助兴,高颜值照流出,细节曝光

博士观察
2026-02-13 15:22:25
白高兴一场!日本赌中方忍让,扣船之后才知,中方没按剧本走!

白高兴一场!日本赌中方忍让,扣船之后才知,中方没按剧本走!

一网打尽全球焦点
2026-02-14 19:21:56
新年将至,黄一鸣带女儿闪闪,祝爷爷奶奶福如东海,王健林会理吗

新年将至,黄一鸣带女儿闪闪,祝爷爷奶奶福如东海,王健林会理吗

查尔菲的笔记
2026-02-14 18:02:58
杨瀚森8分钟10分!中国小将惊艳全明星,常规赛短板还是得改进

杨瀚森8分钟10分!中国小将惊艳全明星,常规赛短板还是得改进

布斯基
2026-02-14 23:30:41
中戏风波再升级!3人自首,4任领导落马,闫学晶没想到会连累他

中戏风波再升级!3人自首,4任领导落马,闫学晶没想到会连累他

胡一舸南游y
2026-02-14 19:11:55
什么是干休所,要达到什么军衔的军官,才能进干休所?

什么是干休所,要达到什么军衔的军官,才能进干休所?

触摸史迹
2025-12-21 19:31:28
巴基斯坦卫星搭乘中国火箭成功升空,巴总理:巴基斯坦取得又一个太空事业里程碑

巴基斯坦卫星搭乘中国火箭成功升空,巴总理:巴基斯坦取得又一个太空事业里程碑

环球网资讯
2026-02-14 07:06:04
奥林匹克精神何在?加拿大冰壶队比赛中作弊,被发现后辱骂对手

奥林匹克精神何在?加拿大冰壶队比赛中作弊,被发现后辱骂对手

全景体育V
2026-02-14 08:09:41
13岁体操冠军傅佳丽被虐待导致跳楼 央媒跟进:2名涉事教练被立案

13岁体操冠军傅佳丽被虐待导致跳楼 央媒跟进:2名涉事教练被立案

做一个合格的吃瓜群众
2026-02-13 10:27:49
2026-02-15 00:51:00
51Testing软件测试网 incentive-icons
51Testing软件测试网
中国软件测试人的精神家园
1523文章数 13252关注度
往期回顾 全部

科技要闻

字节跳动官宣豆包大模型今日进入2.0阶段

头条要闻

福州街头发现一流浪老人身份成谜 程序员精准破解方言

头条要闻

福州街头发现一流浪老人身份成谜 程序员精准破解方言

体育要闻

最戏剧性的花滑男单,冠军为什么是他?

娱乐要闻

春晚第五次联排路透 明星积极饭撒互动

财经要闻

谁在掌控你的胃?起底百亿"飘香剂"江湖

汽车要闻

星光730新春促销开启 80天销量破2.6万台

态度原创

教育
游戏
数码
艺术
公开课

教育要闻

学校又被投诉了!

粉丝怒了!育碧传奇老游戏重制删原版配乐遭吐槽

数码要闻

LG新推耳机,Lite和Plus功能差异竟这么大!

艺术要闻

你绝对想不到!百大美女竟然在中国当辣妈!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版