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

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-14 19:27:40
郭富城陪方媛回安徽过年,身高年龄都太有梗,合影画面太微妙

郭富城陪方媛回安徽过年,身高年龄都太有梗,合影画面太微妙

东方不败然多多
2026-02-14 12:56:11
春节需求激增!95后女生9天接了100多单,最多一天有22单,能赚8500元

春节需求激增!95后女生9天接了100多单,最多一天有22单,能赚8500元

中国品牌
2026-02-14 18:14:38
15年前,那个当着全世界喝下核污染水的日本官员,如今还活着吗?

15年前,那个当着全世界喝下核污染水的日本官员,如今还活着吗?

墨兰史书
2026-02-09 23:08:35
瓜迪奥拉买对了!从樱桃大腿到蓝月尖刀,他用一个月征服伊蒂哈德

瓜迪奥拉买对了!从樱桃大腿到蓝月尖刀,他用一个月征服伊蒂哈德

里芃芃体育
2026-02-15 15:00:06
京东法国巴黎仓库失窃案告破,绝大多数被盗物资已追回

京东法国巴黎仓库失窃案告破,绝大多数被盗物资已追回

IT之家
2026-02-14 09:52:15
谁能想到,马云对美团王兴的复仇,一等就是整整十年

谁能想到,马云对美团王兴的复仇,一等就是整整十年

流苏晚晴
2025-12-29 18:31:44
痛心!10岁男童吃猪脚卡喉身亡!母亲发声:为什么一口肉就要了他的命

痛心!10岁男童吃猪脚卡喉身亡!母亲发声:为什么一口肉就要了他的命

福建卫生报
2026-02-15 17:59:57
英媒:中国将中子弹纳入常规装备,若属实,代理人战争算是废了

英媒:中国将中子弹纳入常规装备,若属实,代理人战争算是废了

我心纵横天地间
2026-01-29 15:24:36
回顾“91女神”琪琪:五官出众,却因天真让自己“受伤”

回顾“91女神”琪琪:五官出众,却因天真让自己“受伤”

就一点
2025-11-22 10:36:39
四连冠没了!麦克朗为何不参加扣篮大赛?

四连冠没了!麦克朗为何不参加扣篮大赛?

篮球实录
2026-02-15 17:52:25
意甲裁判指派员:罚下卡卢卢是主裁的误判;巴斯托尼明显假摔

意甲裁判指派员:罚下卡卢卢是主裁的误判;巴斯托尼明显假摔

懂球帝
2026-02-15 18:50:07
樊振东3-1逆转贾哈!后三局拿捏关键分,为萨尔布吕肯夺首胜!

樊振东3-1逆转贾哈!后三局拿捏关键分,为萨尔布吕肯夺首胜!

篮球资讯达人
2026-02-15 20:50:48
妈妈嫁给爸爸的理由有多简单粗暴?网友:我爹图我姥爷是县委书记

妈妈嫁给爸爸的理由有多简单粗暴?网友:我爹图我姥爷是县委书记

带你感受人间冷暖
2026-02-11 12:27:35
比中国还大的西伯利亚,一年“冬眠”七个月,当地居民如何过冬?

比中国还大的西伯利亚,一年“冬眠”七个月,当地居民如何过冬?

阿諢体育
2026-02-15 09:48:26
汪家双喜临门!筱梅深夜开播:宝宝姓名已定,汪小菲定下陪产计划

汪家双喜临门!筱梅深夜开播:宝宝姓名已定,汪小菲定下陪产计划

未曾青梅
2026-02-14 20:20:21
摔倒后逆袭!谷爱凌开怀大笑:我4年没练大跳台了 一不小心进决赛

摔倒后逆袭!谷爱凌开怀大笑:我4年没练大跳台了 一不小心进决赛

念洲
2026-02-15 06:55:08
有关薄一波的十个冷知识

有关薄一波的十个冷知识

深度报
2026-02-13 22:45:30
王毅在慕尼黑安全会议上,拿德国和日本作对比,日本媒体人不干了

王毅在慕尼黑安全会议上,拿德国和日本作对比,日本媒体人不干了

安安说
2026-02-15 12:43:39
A股:历史或惊人相似!节前大跌,这一次节后首日会不会重演千股跌停

A股:历史或惊人相似!节前大跌,这一次节后首日会不会重演千股跌停

股市皆大事
2026-02-15 12:45:11
2026-02-15 22:27:01
51Testing软件测试网 incentive-icons
51Testing软件测试网
中国软件测试人的精神家园
1523文章数 13252关注度
往期回顾 全部

科技要闻

发春节红包的大厂都被约谈了

头条要闻

小米YU7刚交付20分钟传出一声巨响 车主看到裂痕崩溃

头条要闻

小米YU7刚交付20分钟传出一声巨响 车主看到裂痕崩溃

体育要闻

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

娱乐要闻

河南春晚被骂上热搜!大量广告满屏AI

财经要闻

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

汽车要闻

奔驰中国换帅:段建军离任,李德思接棒

态度原创

艺术
本地
游戏
手机
公开课

艺术要闻

159米!北京CBD最被低估的建筑:设计很能打,存在感却不高

本地新闻

春花齐放2026:《骏马奔腾迎新岁》

LCK第一阶段:爆大冷!BFX三比一战胜T1,与GEN会师胜者组决赛

手机要闻

荣耀宣布推出旗下六款热门笔记本机型延长宝服务优化

公开课

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

无障碍浏览 进入关怀版