当前位置: 首页 > 科技观察

实用的MySQL调试和优化技巧

时间:2023-03-19 20:46:08 科技观察

MySQL是一个强大的开源数据库。随着越来越多的数据库驱动的应用程序,人们一直在将MySQL推向极限。这里有101个调整和优化MySQL安装的技巧。一些提示特定于安装环境,但这些想法是通用的。我将它们分为几类,以帮助您掌握更多的MySQL调优技巧。MySQL服务器硬件和操作系统调整:1.有足够的物理内存将整个InnoDB文件加载到内存中——在内存中访问文件比在硬盘上访问文件快得多。2.不惜一切代价避免使用Swap——Swap是从硬盘读取的,速度很慢。3.使用电池供电的RAM(注意:RAM是指随机存取存储器)。4、使用高级RAID(注:RedundantArraysofInexpensiveDisks,即磁盘阵列)——最好是RAID10或更高。5、避免RAID5(注:一种平衡存储性能、数据安全和存储成本的存储方案)——保证数据库的完整性是要付出代价的。6.将操作系统和数据分区分开,不仅在逻辑上,而且在物理上——操作系统的读写操作会影响数据库的性能。7、MySQL临时空间,将日志和数据拷贝到不同的分区——数据库后台读写磁盘时,会影响数据库的性能。8.更多的磁盘空间等于更快的速度。9.更好更快的磁盘。10、用SAS(注:SerialAttachedSCSI,即串行连接的SCSI)代替SATA(注:SATA,即串口硬盘)。11.较小的硬盘驱动器比较大的硬盘驱动器更快,尤其是在RAID配置中。12.使用电池供电的高速缓存RAID控制器。13.避免使用软件磁盘阵列。14.考虑为数据分区使用固态IO卡(不是磁盘驱动器)——这些卡能够支持几乎任何数据量的2GB/s写入速度。15.在Linux中将swappiness设置为0——没有理由在数据库服务器中缓存文件,这是服务器或桌面的优势。16.如果可以,使用noatime和nodirtime挂载文件系统——没有理由更新访问数据库文件的修改时间。17.使用XFS文件系统——比ext3更快更小的文件系统,并且有很多日志选项,而且ext3已被证明与MySQL有双缓冲问题。18.调整XFS文件系统日志和缓冲变量-以获得最佳性能指标。19.在Linux系统中,使用NOOP或DEADLINEIO调度器-与NOOP和DEADLINE调度器相比,这种CFQ和ANTICIPATORY调度器非常慢。20、使用64位操作系统——对于MySQL,会有更大的内存支持和使用。21.删除服务器上不用的安装包和守护进程——减少资源占用。22.将使用MySQL的主机和你的MySQL主机放在一个主机文件中——没有DNS查找。23.永远不要强行终止MySQL进程——你会损坏数据库和正在运行备份的程序。24.将服务器专用于MySQL——后台进程和其他服务可以减少数据库占用的CPU时间。MySQL配置:25.写入时使用innodb_flush_method=O_DIRECT,避免双缓冲。26.避免使用O_DIRECT和EXT3文件系统——你会序列化所有要写的东西。27.分配足够的innodb_buffer_pool_size以将整个InnoDB文件加载到内存中——从磁盘读取更少。28.不要将innodb_log_file_size参数设置太大,这样会更快并且有更多的磁盘空间——多扔一些日志通常是好的,并且可以减少数据库崩溃后恢复数据库的时间。29.不要混用innodb_thread_concurrency和thread_concurrency参数——这2个值是不兼容的。30.为max_connections参数分配一个非常小的数字——太多的连接会耗尽RAM并锁定MySQL服务。31.将thread_cache保持在一个相对较高的值,大约16-防止打开连接时速度变慢。32.使用skip-name-resolve参数——删除DNS查找。33.如果你的查询是重复的,而且数据不经常变化,你可以使用查询缓存。但是如果你的数据经常变化,使用查询缓存会让你失望。34.增加temp_table_size的值,防止写入磁盘35.增加max_heap_table_size的值,防止写入磁盘36.不要将sort_buffer_size的值设置得太高,否则你的内存会很快耗尽37.根据key_read_requests和key_reads值来确定key_buffer的大小。一般来说,key_read_requests应该大于key_reads值,否则不能有效使用key_buffer38。将innodb_flush_log_at_trx_commit设置为0会提高性能,但是如果要保持默认值(1),那么你要保证数据的完整性,但同时又要保证复制不滞后。39、必须有一个测试环境来测试你的配置,可以经常重启而不影响正常生产。MySQL模式优化:40.保持数据库井井有条。41.旧数据归档——删除冗余行返回或搜索查询。42.索引你的数据。43、不要过度使用索引,比较查询。44.压缩文本和BLOB数据类型——以节省空间并减少磁盘读取时间。45.UTF8和UTF16都低于latin1的执行效率。46.谨慎使用触发器。47.尽量减少冗余数据——不要重复不必要的数据。48.使用链接表而不是扩展行。在真实数据中,尽可能使用最小的数据。50、如果其他数据经常用于查询,而BLOB/TEXT数据不是,将BLOB/TEXT数据与其他数据分开。51.经常检查和优化表.52。经常重写InnoDB表优化。53.有时候,在添加列的时候,删除索引,然后再添加回来,这样会更快。54.针对不同的需求使用不同的存储引擎。55.使用归档存储引擎日志表或审计表——这样写效率更高。56.Session数据存储在缓存(memcache)中而不是MySQL-缓存允许自动自动填充并防止您创建难以读取和写入MySQL的时空数据。57.存储变长字符串时使用VARCHAR而不是CHAR——节省空间,因为CHAR是定长的,而VARCHAR不是定长的(UTF8不受此影响)。58.循序渐进的模式变化——一个小的变化可以产生巨大的影响。59.在开发环境中测试所有模式,反映生产变化。60.不要更改配置文件中的值,否则会造成灾难性的后果。61.有时在MySQL配置中少即是多。62.当有疑问时使用通用的MySQL配置文件。查询优化:63.使用慢查询日志来发现慢查询。64、使用执行计划判断查询是否正常运行。65.始终测试您的查询以查看它们是否以最佳方式运行——性能会随着时间的推移而变化。66.避免对整个表使用count(*),它可能会锁住整个表。67.使查询保持一致,以便后续类似的查询可以使用查询缓存。68.在适当的地方使用GROUPBY而不是DISTINCT。69.在WHERE、GROUPBY和ORDERBY子句中使用索引列。70.保持索引简单,不要在多个索引中包含同一列。71.有时MySQL会使用错误的索引,对于这种情况使用USEINDEX。72.使用SQL_MODE=STRICT检查问题。73、对于记录数小于5的索引字段,使用LIMIT代替OR。74.为了避免在更新之前进行SELECT,使用INSERTONDUPLICATEKEY或INSERTIGNORE而不是UPDATE。75、不要使用MAX,使用索引字段和ORDERBY子句。76.避免使用ORDERBYRAND()。77.LIMITM,N在某些情况下实际上会减慢查询速度,请谨慎使用。78.在WHERE子句中使用UNION而不是子查询。79.对于UPDATES(更新),使用SHAREMODE(共享模式)来防止排它锁。80.在重新启动MySQL之前,记得预热你的数据库以确保你的数据在内存中并且查询速度很快。81.使用DROPTABLE,CREATETABLEDELETEFROM从表中删除所有数据。82.Minimizeddata在查询你需要的数据时,使用*会消耗大量的时间。83.考虑持久连接而不是多连接以减少开销。84.基准查询,包括使用服务器上的负载,有时一个简单的查询会影响其他查询。85.当你的服务器负载增加时,使用SHOWPROCESSLIST查看缓慢和有问题的查询。86.针对开发环境中生成的镜像数据测试所有可疑查询。MySQL备份过程:87.从副复制服务器备份。88.在备份过程中停止复制以避免数据依赖和外键约束不一致。89.完全停止MySQL并从数据库文件做一个备份。90.如果使用MySQL转储进行备份,还要备份二进制日志文件——确保复制没有中断。91.不要相信LVM快照——这很可能会造成数据不一致,将来会给您带来麻烦。92.为了更容易的单表恢复,按表导出数据——如果数据与其他表隔离的话。93.使用mysqldump时使用-opt。94.在备份之前检查和优化表。95.为了更快地导入,在导入时暂时禁用外键约束。96.为了更快地导入,在导入时暂时禁用唯一性检查。97.在每次备份后计算数据库、表和索引的大小,以更好地监控数据大小的增长。98.使用自动调度脚本监控复制实例的错误和延迟。99.执行定期备份。100.定期测试你的备份。***101:执行MySQL监控:Monitis推出世界上第一个免费的按需MySQL监控。