大型网站MySQL深度优化揭秘

第1章优化的思路和线路

1.1 网站优化的思路    2

1.2 MySQL优化,nginx这样的东西怎么优化?

第2章硬件层面优化

2.1 数据库物理机

2.1.1 CPU

2.1.2 Memory

2.1.3 disk(磁盘IO)

2.1.4 RAID阵列

2.1.5 网卡

2.1.6 案例

2.2 硬件调整

2.2.1 BIOS调整提高CPU性能

2.2.2 阵列卡调整

第3章软件层面优化

3.1 操作系统

3.2 文件系统层优化

3.3 内核层面优化

第4章 MySQL层面优化

4.1 my.cnf参数的优化

4.2 库和表的设计优化

4.3 SQL语句的优化

4.3.1 抓出来慢查询

4.3.2 每天生成slow.log

4.3.3 尽量不用子查询,用join替代

第5章网站集群架构上来优化数据库

5.1 服务器跑多实例2-4个

5.2 业务拆分:

5.3 数据库前端加缓存

5.4 备份策略

第6章流程制度安全

大型网站MySQL深度优化揭秘

优化的思路和线路

网站优化的思路

解答:从用户打开浏览器,到返回网页内容这个过程优化每一个细节

MySQL优化,nginx这样的东西怎么优化?

建议:根据OSI 7层模型,从下到上。。。以这个为线路

硬件层面优化

数据库物理机

CPU

64位的CPU,服务器2-16,CPU 一般2-4颗 L1,L2越大越好

Memory

48G-96G-128G-256G

48G 2-3个实例

96G 3-4个实例

disk(磁盘IO)

数据库是IO密集应用

机械盘

SAS(不选择SATA),300G*12块,磁盘数量越多IO越高,SAS 15k的硬盘

SSD

测试对比:SAS单盘随机IO,3000IOPS, SSD单盘随机IO达到上万

RAID阵列

选硬件 RAID (0>10>5>1)

网卡

至少千兆(bond), 万兆交换机

数据库服务器尽量不用虚拟化

SLAVE服务器配置最好是大于等于Master

从库会接替主库,从库配置太低,导致延迟

案例

百度:IBM服务器,内存96G-128G, CPU48核心

SINA:dell r510 内存48G,磁盘300*12块, RAID10

硬件调整

BIOS调整提高CPU性能

打开(DAPC)模式,发挥CPU性能

启动Node Interleaving避免NUMA问题

关闭C1E和State等

阵列卡调整

配置CACHE和BBU模块(机械盘)

写策略(always write back)

不要用(wt)策略

关闭阵列预读策略

软件层面优化

操作系统

选择x86_64位系统

系统盘和数据盘分开

极端情况下不分swap分区

避免使用操作系统的软raid

避免使用LVM

专库专用不要跑(LNMP,TOMCAT)

文件系统层优化

调整Cache mode

启动wce=1(Write Cache Enable)

RCD=0(Read Cache Disable)

系统调度算法默认cfq(比较中庸),数据库选择noop,deadline.针对deadline可以调节参数(内核参数)

Centos 6.8 默认ext4可以作为数据库的文件系统,房屋呢量大的话,XFS就更好

Centos7默认也选择了XFS,调整XFS日志,缓冲参数.

mount参数很重要 –o async,noatime,nodirname,nobarrier等

内核层面优化

参考链接:http://oldboy.blog.51cto.com/2561410/1336488
vm.swappiness设置为0,或者0-5,让数据库尽量不使用swap vm.dirty_background_ratio设置5-10,vm.dirty_ratio设置前面的2倍.持续将系统数据刷到磁盘.
参考链接:http://blog.sina.com.cn/s/blog_448574810101k1va.html 减少time_wait
net.ipv4.tcp_tw_recyle=1,net.ipv4.tcp_tw_reuse=1,
net.ipv4.tcp_fin_timeout=2,net.ipv4.tcp_keepalived_time=600

MySQL层面优化

参考链接:http://oldboy.blog.51cto.com/2561410/1726517

my.cnf参数的优化

如果我们采用myisam引擎,key_buffer_size加大.采用innodb

推荐使用innodb, 5.5.5以后默认都是innodb引擎

innodb_buffer_pool_size, 调整为内存的50%,单实例.多实例各25%

innodb_flush_log_at_trx_commit, sync_binlog, 设置为1, 数据可以丢失的话(不重要),可以设置为0, 从库都设置为0,事物的log,多长时间刷入到硬盘里

使用独立表空间. innodb_file_per_table=1. 默认共享表文件效率低

innodb_log_file_size=256M 不要给过大

log_query_time=1 ,log的日志查询,超过1秒的SQL语句,记录到日志里,回头看这个日志,进行优化.

一些session参数,不要设置过大,一个连接就会占用参数设置的大小.不要给过大

Sort_buffer_size, join_buffer_size,read_buffer_size,tmp_table_size,max_heap_table_size这类参数都是session,级别参数.2M6M8M就可以了.

查询缓存参数要设置小一些:query_cache_size = 64M,想要缓存,前端加mc,redis

库和表的设计优化

字符集UTF-8

固定字符串的内容,可以选择char

数据库都要给一个自增的主页,没什么用途.

字段长度,在满足要求前提下,最短的.Varchar(16)

省份,性别,这样内容字段可以设置ENUM类型,mysql系统表(char,ENUM)

尽可能不用text/blob比较大的字段类型(博文帖子),如果使用的话,可以放到子表里

一般针对字段索引,尽量采用字段的前N个字符索引,不要整个字段索引,效率低

多用联合索引,有前缀特性,少用独立索引,性别列,不要建立索引了.效果差

SQL语句的优化

索引优化(运维最常用的)

抓出来慢查询

百度:白名单的方法,设计程序时参与设计,程序上线连接数据库,有个控制查库的东西,请示放我库里,才能查询,数据库没有或者减少慢查询

经常给开发培训,DB水平更高

现在网站慢了,show full processlist; 抓慢查询,连续执行两下,间隔1-2秒,如果还有,怀疑他是慢查询.

日常:把慢查询语句记录到log里面

my.cnf

long_query_time=2 超过两秒的查询
log_queryies_not_using_indexes没有超过两秒没有走索引
log_slow_queries=/data/3306/slow.log

每天生成slow.log

按天切割slow.log,切割后分析软件分析(mysqlsla,-pt-query-digest)

mysqldump slow,myprofi. 优化的语句,不一定是单条占用时间长的,频率搞,单条不长,但是总时间很长的,这些可能也是优化的重点.

对于运维来讲,慢查询SQL发给开发.

有能力和开发一起搞

用explain测试语句是否走索引,set profile深度查看语句执行情况.

检查删除重复的索引,工具pt-duplicate-key-checker

效率很低的索引,检查删除,pt-index-usage工具

尽量不用子查询,用join替代

数据库是存放数据的地方,不是计算数据的地方,计算放在web

搜索功能,like "%daf%",不用数据库搜索

在语句中尽量去掉in or <> 字符

网站集群架构上来优化数据库

参考链接:http://oldboy.blog.51cto.com/2561410/775056

服务器跑多实例2-4个

主从复制最多9个,建议1主5从, 主库采用mixed模式,不要跨机房复制(如果是,远程写,本地读

业务拆分:

搜索功能,like "%daf%",不用数据库搜索

搜索软件:Sphinx,Xapian,Solr

粉丝关注,好关系,统计这类应用比较简单,不用数据库,放到redis(想要持久haunted)

数据库前端加缓存

动态内容转静态化(数据库的数据,转成html文件,放到存储上),好处就是可以使用CDN缓存

数据库采用读写分离,读从库,写主库.

相关软件:MyCat,atlas,cobar,amoeba,MySQL-proxy

单表超过800W,拆库拆表,自动扩容,自动收缩.

备份策略

选择从库备份,锁表,备份时间长,影响数据访问

备份时采用分表分库,不分非常费劲.

流程 制度 安全

50%的故障都是人为造成的.

操作流程:开放-->核心开发-->运维或DBA

测试流程:办公室测试-->IDC测试环境测试-->生产环境

[sql]大型网站MySQL深度优化揭秘的更多相关文章

  1. mysql深度优化与理解(迄今为止读到最优秀的mysql博客)

    转载:https://www.cnblogs.com/shenzikun1314/p/6396105.html 本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如 ...

  2. 大型网站提速关键技术(页面静态化,memcached,MySql优化)(一)

    一:关键技术介绍: 衡量是否为大型网站的要素: A:PV值(page views 页面浏览量) 访问量大: 带来的问题:1:流量大 -->解决方案:增加带宽,优化程序(视频和图片较浪费带宽,尽量 ...

  3. 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

    作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...

  4. 举个栗子看如何做MySQL 内核深度优化

    本文由云+社区发表 作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MyS ...

  5. 如何深度优化MySQL内核

    MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是I ...

  6. 大型网站优化-memcache技术

    大型网站优化-memcache技术 memory+cache 内存缓存 memcache简介 memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发 ...

  7. 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

    一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...

  8. Mysql在大型网站的应用架构演变

    原创文章,转载请注明: 转载自http://www.cnblogs.com/Creator/本文链接地址: Mysql在大型网站的应用架构演变 本文已经被多处转载,包括CSDN推荐以及码农周刊等等,阅 ...

  9. MySQL内核深度优化

    版权声明:本文由简怀兵原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/179 来源:腾云阁 https://www.qclo ...

随机推荐

  1. MVC 之 <%%>相关内联代码块用法

    1.<%@ ... %> 添加引用; 2.<% ... %> <%%>之间可以执行服务端代码,如<% foreach (DataRow dataRow in ...

  2. 局域网连接打印机(Win10)

    局域网支持交换机和WIFI环境下进行连接(要求连上打印机的电脑已开启) 1.首先打开控制面板 2.硬件和声音 3.高级打印机设置 4.找到要连接的打印机,通过浏览(R) 添加局域网某台机器上的打印机, ...

  3. java之八大排序

    的关系:  1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如此反 ...

  4. ORA-14402:更新分区关键字列将导致分区更改(分区表注意)

    建立完分区表后一定要和开发确认一点,就是是否会修改分区字段.因为update分区字段到其他分区时候,会报错.解决办法:开启表的行转移功能 alter table XX enable row movem ...

  5. python之smtplib模块 发送邮件

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #smtplib模块 发送邮件 import smtplib from email.mime.text imp ...

  6. 怎么将手动设定的IP变成固定的自动IP.

    怎么将手动设定的IP变成固定的自动IP. 基本原理是 是用的MAC 地址来绑定你的IP地址 方法1左下角 开始→运行→输入  cmd  回车→输入 ipconfig /all 用来查看你的MXC地址 ...

  7. apacheBench对网站进行压力测试

    apacheBench对网站进行压力测试 分类: 学习 2014-02-19 10:35 4154人阅读 评论(1) 收藏 举报 apacheBench压力测试 Apache Benchmark下载 ...

  8. 封装UIlabel 辨别用户名 ,话题 ,链接,电话,高亮文字等

    概述 对UIlabel进行封装 用于辨别用户名 ,话题 ,链接,电话,高亮文字等,链接跳转网页,电话点击拨打电话,完美封装UIlabel,适合绝大多数需求 详细 代码下载:http://www.dem ...

  9. pat1040:有几个PAT

    https://www.patest.cn/contests/pat-b-practise/1040 #include "stdio.h" int main() { int p = ...

  10. 执行存储过程报错——ora-01031:权限不足

    1. 执行DDL报错 在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE ···了,如下备份表语句 --抄表表备 ...