| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL优化 -> 正文阅读 |
|
[大数据]MySQL优化 |
MySQL瓶颈优化(业务从小到大的转变) 假设一个网站从最开始访问量很小做到日PV千万,我们来推测一下 它的mysql服务器架构演变过程。 第一阶段: 网站访问量日pv量级在1w以下。单台机器跑web和db,不需要做 架构层调优(比如,不需要增加memcached缓存)。此时,数据往往都是每日冷备份的,但是有时候如果考虑 数据安全性,会搭建一个mysql主从。 第二阶段: 网站访问量日pv达到几万。此时单台机器已经有点负载,需 要我们把web和db分开,需要搭建memcached服务作为缓存。也就是说,在这个阶段,我们还可以使用单台机 器跑mysql去承担整个网站的数据存储和查询。如果做mysql主从目的也是为了数据安全性。 第三阶段: 网站 访问量日pv达到几十万。单台机器虽然也可以支撑,但是需要的机器配置要比之前的机器多好多。如果经费允 许,可以购买配置很高的机器来跑mysql服务,但是并不是说,配置翻倍,到了一定阶段配置增加已经不能带 来性能的增加。所以,此阶段,我们会想到做mysql服务的集群,也就是说我们可以拿多台机器跑mysql。但 mysql的集群和web集群是不一样的,我们需要考虑数据的一致性,所以不能简单套用做web集群的方式。可以 做的架构是,mysql主从,一主多从。为了保证架构的强壮和数据完整,主只能是一个,从可以是多个。还有 一个问题,我们需要想到,就是在前端web层,我们程序里面指定了mysql机器的ip,那么当mysql机器有多台 时,程序里面如何去配置?我们可以拿多台机器跑mysql,其中一台写,其他多台是读,我们只需要把读写的ip 分别配置到程序中,程序自动会去区分机器。 第四阶段: 网站访问量日pv到几百万。之前的一主多从模式已 经遇到瓶颈,因为当网站访问量变大,读数据库的量也会越来越大,我们需要多加一些从进来,但是从的数量 增加到数十台时,由于主需要把bin-log全部分到所以从上,那么这个过程本身就是一件很繁琐读取,势必会造 成从上同步过来的数据有很大延迟。所以,我们可以做一个优化,把mysql原来的一主多从为一主一从,然后 作为其他从的主,而前面的主,只负责网站业务的写入,而后面的从不负责网站任何业务,只负责给其他从同 步bin-log。这样还可以继续多叠加几个从库。 第五阶段: 网站访问量日pv到1千万的时候,我们发现,网站的 写入量非常大,我们之前架构中只有一个主,这里的主已经成为瓶颈了。所以,需要再进一步作出调整 解决瓶颈:做索引 查询一些MySQL数据库的性能参数用show status 这是查看链接mysql服务器的次数 ?Uptime:mysql服务器的上线时间 ?Com_select:查询操作的次数 每次执行select就会加一 ?Com_insert:插入操作的次数 ?Com_update:更新操作的次数 ?Com_delete:删除操作的次数 ?Slow_queries:查询mysql服务器的慢查询次数 实验我们所需要的表。
?分析查询语句 ?Select_type:表示select语句的类型 其中simple 是简单查询(不包括连接查询和子查询) Primary 主查询 Union 连 接查询 Type:表的连接类型 System仅有系统表一行 Const 数据表中最多只有一行匹配,将在查询开始时被读取,并在 余下的查询优化中,作为常量 Eq_ref 用于使用 = 操作符比较带索引的列 ref 对于来自前面的表的任意行的组 合,从该表中读取所有匹配的行 ref_or_null 同上,添加可以专门搜索包含null值的行 index_merge 将连接类型 表示使用了索引并优化方法 range 只检索给定范围的行 index 与all的连接类型相同,除了只扫描索引树 all 前面 的表的任意行的组合,进行完整的表的扫描 possible_keys: NULL //指出mysql使用哪个索引在表中找到行 NULL表示没有创建索引 describe select 语句和分析查询语句 我们可以简写直接desc? ?索引提高了查询效率 Create index 索引名 on 表名(字段) 添加单列索引 ? ?优化查询速度 注意: 1做索引了之后,用 like ‘xx%’ %不在第一位查询效率最高 ?多字段索引,除了第一字段查询最快,其余不按索引来,索引不生效 ? ?若创建索引所设置的字段,查询索引组合 or 左右边的值都是属于索引设置字段下的值 ? ?profiling分析查询 通过慢日志查询可以知道哪些SQL语句执行效率低下,通过explain我们可以得知SQL语句的 具体执行情况,索引使用等,还可以结合show命令查看执行状态。如果觉得explain的信息不够详细,可以同通 过profiling命令得到更准确的SQL执行消耗系统资源的信息。 profiling默认是关闭的。可以通过以下语句查看 ?打开profiling功能: mysql>set profiling=1; 执行需要测试的sql 语句: 执行要测试的sql语句 ? ? ? ?status:是profile里的状态,duration:是status状态下的耗时。因此我们关注的就是那个状态最耗时,这些状态 中那些可以优化。 当然也可以查看更多的信息如CPU等等 SHOW PROFILE [type [, type] ... ][FOR QUERY n] type: ?? ????ALL:显示所有的开销信息 ?? ???BLOCK IO:显示 块IO相关开销 ?? ???CPU:显示用户CPU时间、系统CPU时间 ?? ???IPC:显示发送和接收相关开销信息 ?? ????PAGE FAULTS:显示页面错误相关开销信息 ?? ???SWAPS:显示交换次数相关开销的信息 测试完成之以 后,记得要关闭调试功能,以免影响数据库的正常使用: ?优化数据库表结构 将字段很多的表分解成多个表 查看表的表结构 优化表结构 1 将字段很多的表分解成多个表 2 增加中间表 3 合理增加冗余字段 4 优化插入记录的速度 (1), 禁用索引(在插入数据之前禁用索引,会让创建索引不会生效,命令:alter table 表名 disable keys ,注意表的 创建表后加引擎 engine=myisam,可以禁用成功) show create table 表面\g可以看表的引擎 修改引擎 ? ? ?禁用唯一性检查(插入记录之前禁用唯一性检查,命令:set unique_checks=0 关闭set unique_checks=1) ? ?使用批量插入(多条插入命令整合成一条命令)
?使用load data infile批量插入 对于innnodb表来说 (1) 禁用唯一性检查 ?禁用外键检查(命令: set foreign_key_checks=0,开启=1) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:48:31- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |