目录MySQLbinlog_format=mixed,是否可行?为什么MySQL会误删frm文件?PHP连接MySQL是否遇到过性能问题,如何解决?MySQL常用的SQL调优方法或工具有哪些在2c4g服务器上,如何使用python操作8GB超大文件MySQL响应慢排查思路1.MySQLbinlog_format=mixed,是否可行,为什么不可行,因为会造成主从数据不一致Mixed格式相当于Row和Statement模式的融合。当表结构发生变化时,会以语句方式进行记录。更新或删除等修改数据的语句仍然会记录所有行的变化。但在某些情况下,会出现主从数据不一致的情况。例如:1.多列表更新自增主键时,调用触发器或存储函数。2.当SQL使用LOAD_FILE()函数时。(错误号39701)3.当一条SQL语句引用一个或多个系统变量时。(Bug#331168)更多信息请参考:https://dev.mysql.com/doc/ref...2.MySQL不小心删除了frm文件怎么办?情况一:误删1后MySQL没有重启。restorethe.frmfilefromproccp/proc/pidofmysqld/fd/误删.frm/datadir/db/对应库的目录/情况二:误删重启2.从数据库中获取表结构的物理备份备份。直接从物理备份中复制.frm文件。逻辑备份。找到表的DDL,在备实例中创建表,将.frm文件拷贝回来。注意:1.无论是情况一还是情况二,都需要重新设置所有者和组。2、如果恢复时对表执行了新的DDL,上述方法可能不起作用。3、本案例在MySQL5.7.18版本(开启表独立空间模式)下通过了个人测试。3、你遇到过PHP连接MySQL的性能问题,如何解决?有PHP用来连接MySQL的本机mysql扩展、mysqli和pdo_mysql。与MySQL的连接可以分为三类:1、短连接,每次都需要建立新的连接,数据库开销比较大。特别是在高并发环境下,数据库连接数可能会直接占满,CPU会很高。2、长连接,但是不能像连接池那样实现连接重用。如果控制不好,更容易导致数据库连接数爆炸。3、使用第三方应用提供的连接池功能,如swoole、ProxySQL等,基本可以解决连接性能瓶颈。特别是ProxySQL还可以顺便解决读写分离、高可用切换等问题。还建议设置net.ipv4.tcp_tw_reuse=1,开启tcp重用,提高tcp连接性能。四、MySQL常用的SQL调优方法或工具有哪些1、根据执行计划优化,通常使用desc或explain。另外可以加上format=json,以json格式输出更详细的执行计划。主要注意事项如下:type:显示关联类型。关注ALL(全表扫描)、index(全索引扫描);key_len:使用的索引的长度。通常如果大于30,需要注意选择的索引是否为字符串类型,是否可以进一步优化;rows:估计扫描的行数。通常如果该值大于10000,需要注意是否可以选择更合适的索引来减少扫描的行数;extra:显示附加信息。着重于Usingtemporary,Usingfilesort,尝试通过添加或调整来消除。2、使用profiling优化,通过probe记录SQL执行过程的详细开销,让你清楚的知道SQL哪里慢了。关注以下情况是否耗时:sendingdatacreatingsortindexsortingresultqueryendWaiting...lockCreatingtmptableCopyingtotmptable3。使用optimizer_trace优化可以输出优化器评估SQL执行计划的详细过程,尤其是对每个可能的索引选择的价格。用它来理解为什么优化器选择索引A而不是索引B。4.使用会话状态优化通过flushstatus重置会话级状态值后,执行sql查看相应的状态变化。可以关注几个信息:Created_tmp_tables,创建内存临时表Created_tmp_disk_tables,创建磁盘临时表,特别注意Handler_read_rnd,随机读取Handler_read_rnd_next,全表扫描or排序或者读取下一行select_scan,全表扫描select_full_join,全表joinsort_merge_passes等合并排序5.其他优化工具如MySQLworkbench,pt-query-digest等5.如何使用python在2c4g服务器上操作8GB大文件1.使用withopen的方法,forlineinf文件对象f被视为一个迭代器,会自动使用缓冲IO和内存管理,并且可以自动关闭文件。比如推荐这种方法:withopen('filename')asf:forlineinf:do_things(line)2.打开文件的方法,可以通过read(size)来指定每次读取的大小,切大的将文件分成小文件进行读取,每处理完一个小块就释放内存。Example:f=open(filePath)whileTrue:content=f.read(chunk_size)do_things(content)3.linecache模块可以指定要读取的文件的某一行。示例:content=linecache.getline('filename',linenum)do_things(content)6.MySQL响应慢的排查思路(1)导致MySQL慢的可能因素包括1.计算资源不足2.系统层面的基础优化,或者不同进程间的资源抢占3.不科学的MySQL配置(附神器:http://imysql.com/my-cnf-wiza....4.垃圾SQL满天飞(2)检查负载系统层面1.top查看整体负载情况,快速确认哪个进程负载高2.free查看内存情况,是否存在内存泄露、swap使用等风险3.vmstat/sar查看当前系统瓶颈在哪里,比如CPU,IO,网络等4.终极神器perftop查看哪些系统调用函数被CPU消耗了(三)查看MySQL的整体情况1.观察showprocesslist输出中是否存在临时表、排序、大量逻辑读、锁等待等状态2.观察showengineinnodb输出中是否存在大事务、长事务、锁等待等状态状态(四)摆脱垃圾SQL,常用方法1.使用explain和desc观察执行计划2.使用profiling定位sql执行瓶颈3.使用pt-query-digest分析慢sql(五)几个小技巧1.如果mysqld进程消耗90%以上CPU用了半天,99.9%是因为索引没用好。如果CPU的%sys很高,很可能是swap不平衡或者中断造成的。也有可能是多个索引超高并发写入(更新),或者锁等待事件严重。3.最大的瓶颈通常是磁盘I/O,所以尽量使用高速磁盘设备。4.如果物理磁盘无法升级,通过增加内存来增加性能容量。5.遇到无法诊断的问题,尝试使用perftop观察跟踪6.SQL执行慢不一定是效率低下,也可能是等待锁,甚至满盘MySQL干货知识,跟随公众号获得
