php 面试mysql,mysql中优化必读
通用规则
多读少写加缓存,少读多写加队列
带事务的不要整体commit,分段commit
一、要保证数据库的效率,要做好以下四个方面的工作:
① 数据库设计
② sql语句优化
③ 数据库参数配置
④ 恰当的硬件资源和操作系统
二、通俗地理解三个范式,对于数据库设计大有好处。
在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
第二范式:2NF是对记录的唯一性约束,要求记录有惟一标识,即实体的唯一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 没有冗余的数据库设计可以做到。
但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
三、SQL优化的一般步骤
①通过show status命令了解各种SQL的执行频率。
②定位执行效率较低的SQL语句-(重点select)
③通过explain分析低效率的SQL语句的执行情况
④确定问题并采取相应的优化措施
下面的例子:
#其中Com_XXX表示XXX语句所执行的次数。show global status like 'Com_%';
重点注意:Com_select,Com_insert,Com_update,Com_delete通过这几个参数,可以容易地了解到当前数据库的应用是以插入更新为主还是以查询操作为主,以及各类的SQL大致的执行比例是多少。
#其中Com_XXX表示XXX语句所执行的次数。show global status like 'com_%';
#试图连接MySQL服务器的次数show status like 'Connections';
#服务器工作的时间(单位秒)show status like 'Uptime';
#慢查询的次数 (默认是10)show status like 'Slow_queries'
4.如何查询mysql的慢查询时间Show variables like 'long_query_time';
5. 修改mysql 慢查询时间set long_query_time=2
四、哪些列上适合添加索引
1、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件select * from emp where sex = '男'
2、更新非常频繁的字段不适合创建索引select * from emp where logincount = 1
#查看索引的使用情况show status like 'Handler_read%';
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next:这个值越高,说明查询低效。含义:在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明你的表索引不正确或写入的查询没有利用索引。”
优化group by 语句
默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序
optimizer_trace
从MySQL5.6版本开始,optimizer_trace
可支持把MySQL查询执行计划树打印出来,默认是关闭的,功能支持动态开关,因为对性能有20%左右影响,只建议分析问题时,临时开启。
1. 默认是关闭的mysql> show variables like 'optimizer_trace';
+-----------------+--------------------------+
| Variable_name | Value |
+-----------------+--------------------------+
| optimizer_trace | enabled=off,one_line=off |
+-----------------+--------------------------+
1 row in set (0.05 sec)
2.演示 optimizer_trace 简单的使用流程:
2.1 会话级别临时开启mysql>
set session optimizer_trace="enabled=on",end_markers_in_json=on;
2.2 执行你的SQLselect host,user,plugin from user ;
2.3 查询information_schema.optimizer_trace表mysql> SELECT trace FROM information_schema.OPTIMIZER_TRACE\G;
2.4 导入到一个命名为xx.trace的文件,然后用JSON阅读器来查看SELECT TRACE INTO DUMPFILE “xx.trace” FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
补充:永久开启 optimizer_trace (重启失效)mysql> set optimizer_trace="enabled=on";
五、最重要的参数就是内存,我们主要用的innodb引擎,所以下面两个参数调的很大
innodb_additional_mem_pool_size = 64M
innodb_buffer_pool_size =1G
对于myisam,需要调整key_buffer_size
innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数
推荐的做法是
innodb_flush_log_at_trx_commit=2
sync_binlog=N (N为500 或1000) 默认sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。
且使用带蓄电池后备电源的缓存cache,防止系统断电异常。
一 参数意义
innodb_flush_log_at_trx_commit
InnoDB的innodb_flush_log_at_trx_commit属性可以控制每次事务提交时InnoDB的行为。当属性值为0时,事务提交时,不会对重做日志进行写入操作,而是等待主线程按时写入;当属性值为1时,事务提交时,会将重做日志写入文件系统缓存,并且调用文件系统的fsync,将文件系统缓冲中的数据真正写入磁盘存储,确保不会出现数据丢失;当属性值为2时,事务提交时,也会将日志文件写入文件系统缓存,但是不会调用fsync,而是让文件系统自己去判断何时将缓存写入磁盘。
innodb_flush_log_at_commit是InnoDB性能调优的一个基础参数,涉及InnoDB的写入效率和数据安全。
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
注:
如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作。
根据上述描述,我做了一张图,可以方便大家查看。
二 性能
两个参数在不同值时对db的纯写入的影响表现如下:
测试场景1
innodb_flush_log_at_trx_commit=2
sync_binlog=1000
测试场景2
innodb_flush_log_at_trx_commit=1
sync_binlog=1000
测试场景3
innodb_flush_log_at_trx_commit=1
sync_binlog=1
测试场景4
innodb_flush_log_at_trx_commit=1
sync_binlog=1000
测试场景5
innodb_flush_log_at_trx_commit=2
sync_binlog=1000
场景TPS
场景141000
场景233000
场景326000
场景433000
由此可见,当两个参数设置为双1的时候,写入性能最差,sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL的写操作才能达到最高性能。
三 安全
当innodb_flush_log_at_trx_commit和sync_binlog 都为 1 时是最安全的,在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。
当innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
当innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。
双1适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时 比如11.11 活动的压力
总结
一、为了保证事务的ACID特性,理论上每次事务提交都应该刷盘,但此时效率很低,有两种优化方向:
(1)随机写优化为顺序写;
(2)每次写优化为批量写;
二、redo log是一种顺序写,它有三层架构:
(1)MySQL应用层:Log Buffer
(2)OS内核层:OS cache
(3)OS文件:log file
三、为了满足不用业务对于吞吐量与一致性的需求,MySQL事务提交时刷redo log有三种策略:
(1)0:每秒write一次OS cache,同时fsync刷磁盘,性能好;
(2)1:每次都write入OS cache,同时fsync刷磁盘,一致性好;
(3)2:每次都write入OS cache,每秒fsync刷磁盘,折衷;
四、高并发业务,行业内的最佳实践,是:
innodb_flush_log_at_trx_commit=2
版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
php 面试mysql,mysql中优化必读相关推荐
- php面试专题---MYSQL查询语句优化
php面试专题---MYSQL查询语句优化 一.总结 一句话总结: mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存) ...
- php面试专题---MySQL常用SQL语句优化
php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...
- #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
Linux + JVM + Mysql高级性能优化课程 课程名称: Linux + JVM + Mysql高级性能优化 QQ群: 243242580(小白.菜鸟勿进)跟Java.M ...
- mysql distinct 优化_Mysql应用分析MySQL中优化distinct的技巧
<MysqL应用分析MysqL中优化distinct的技巧>要点: 本文介绍了MysqL应用分析MysqL中优化distinct的技巧,希望对您有用.如果有疑问,可以联系我们. sql用于 ...
- mysql distinct 慢_分析MySQL中优化distinct的技巧
有这样的一个需求:select count(distinct nick) from user_access_xx_xx; 这条sql用于统计用户访问的uv,由于单表的数据量在10G以上,即使在user ...
- mysql sql语句优化面试_面试不要一把梭了,这才是SQL优化的正确姿势
全文内容预览: 所以,在开始之前(MySQL 优化),咱们先来聊聊性能优化的一些原则. 性能优化原则和分类 性能优化一般可以分为:主动优化 被动优化 所谓的主动优化是指不需要外力的推动而自发进行的一种 ...
- DBA很忙—MySQL的性能优化及自动化运维实践
作者:王辰 来自:高效运维(ID:greatops) DBA的日常工作 首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 D ...
- MySQL - 践行索引优化
文章目录 生猛干货 Pre Table Demo DB Version Case 全值匹配 最左前缀 禁止索引列上做任何操作(计算.函数.(自动or手动)类型转换) 存储引擎不能使用索引中范围条件右边 ...
- mysql存储引擎优化参数
MySQL配置参数优化 本文来自道森学习笔记,版权归 http://wubx.net/ 所有 MyISAM存储引擎优化 涉及参数如下: Key_buffery_size Concurrent_inse ...
最新文章
- 浮点加减运算之0舍1入法与恒置1法
- MFC 列表控件CListCtrl加载类似QQ界面的头像与文字
- Luogu P3953 逛公园
- 时间序列研(part1)--随机过程
- 来吧学学.Net Core之项目文件简介及配置文件与IOC的使用
- 草稿 爬虫-访问登陆可见的页面-请求时带上cookie数据
- ssm框架使用resultful_SSM框架整合完整案例
- 运筹学 美国人在计算机上实现的四,运筹学试卷及答案
- oracle 时间转换 1970,oracle 中将unix/linux时间戳进行转换(转)
- Step 1: 盲打第三天
- 纸的大小图解_手工折纸大全图解 不一定是A4大小)一般都有7
- 在Arduino和ESP32-s2环境下,测试WiFi Fine Time Measurement (FTM) Round Trip Time (RTT) 的定位和测距
- 探索跨平台应用开发的最佳实践
- uchome的安装记录
- POJ 1436 Horizontally Visible Segments(线段树建图+枚举)
- [总结]2019年10月 OI学习/刷题记录
- 写php程序出现乱码怎么办?
- Matlab中hold函数使用
- MicroNet论文复现:用极低的FLOPs改进图像识别
- Git安装图文教程(Windows、Linux全平台)
热门文章
- AI+IoT+电池应用
- Mask-RCNN技术解析
- getIntExtra() 获取传递过来的int 值总是默认值
- css z-index 的使用
- Android 9.0 系统弹框
- 探索未知种族之osg类生物---器官初始化四
- 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象
- 小程序中点击input控件键盘弹出时placeholder文字上移
- Go 学习笔记(8)— 条件语句(if、if...else...、switch、fallthrough)
- python基础 条件和循环