mysql服务器怎么加速
① 濡备綍瑙e喅灞锘熺绣鍐卪ysql鏁版嵁搴撹繛鎺ユ参_MySQL
阃氲繃鍐呯绣杩炲彟澶栦竴鍙版満鍣ㄧ殑mysql链嶅姟锛 纭鍙戠幇阃熷害N鎱锛 绛変简澶х害鍑犲崄绉掓墠绛夊埌鎻愮ず杈揿叆瀵嗙爜銆 浣嗘槸ping mysql镓鍦ㄦ湇锷″櫒鍗村緢蹇锛 𨱍冲埌寰堜箙涔嫔墠链夎繃绫讳技镄勭粡楠岋纴 telnet绛変竴浜涙湇锷″湪杩炴帴璇锋眰镄勬椂鍊欙纴浼氩仛涓浜涘弽钖戝烟钖嶈В鏋愶纸濡傛灉鍙嶅悜瑙f瀽涓嶉‘鐣咃纴 浼拌″氨浼氩欢杩熷緢澶氾纴 缁欎汉镄勬劅瑙夋槸杩炴帴阃熷害N鎱锛侊级
鍦ㄧ绣涓婃悳绱浜嗕笅瑙e喅锷炴硶锛 鍙戠幇链変袱绉嶏细
涓. 涓よ竟链哄櫒閰岖疆镄剅esolve.conf涓崭竴镙凤纴 鎶妑esolve.conf閰岖疆鎴愰熷害姣旇缉蹇镄凞NS灏监K
浜. 鎶妋ysql閰岖疆涓镄凞NS鍙嶅悜瑙f瀽鍏虫帀锛 涔烵K
鎴戠敤镄勬槸绗涓绉嶅姙娉曪纴 淇鏀箁esolve.conf閰岖疆钖庯纴 阃熷害灏变笂𨱒ヤ简锛
闄勪竴锛 鎽樿嚜http://gcoder.blogbus.com/logs/31907502.html
涓ゅ彴鍦ㄥ悓涓缃戞电殑链哄櫒, 杩炴帴钖屼竴涓鏁版嵁搴撴湇锷″櫒, 涓鍙扮殑阃熷害鏄鍙︿竴鍙扮殑100鍊, 鏁版嵁搴扑富链烘槸锘熷悕琛ㄧず镄. 镐庝箞閮芥兂涓嶆槑锏?
钖庢潵镆ョ湅涓ゅ彴链哄櫒镄 /etc/resolv.conf, 鍙戠幇閰岖疆涓崭竴镙, 鏀规垚阃熷害蹇镄勯偅鍙版満鍣ㄧ殑閰岖疆, 阃熷害闾d笂灏变笂𨱒ヤ简.
锘熷悕瑙f瀽涔熷彲浠ュ艰嚧缃戠粶绋嫔簭鎱, 鍙堜竴鏀惰幏. 鍙﹀, mysql杩樻湁DNS鍙嶅悜瑙f瀽镄勯梾棰, 涔熷彲鑳藉艰嚧阃熷害鎱, 鍙浠ュ湪mysql镄勯厤缃鏂囦欢涓, 鎶奃NS鍙嶅悜瑙f瀽鍏虫帀.
闄勪簩锛 鎽樿嚜
褰撹繙绋嬭块梾mysql镞讹纴mysql浼氲В鏋愬烟钖嶏纴浼氩艰嚧璁块梾阃熷害寰堟参锛屽姞涓娄笅闱㈣繖涓閰岖疆鍙瑙e喅姝ら梾棰
# 绂佹mysql锅氩烟钖嶈В鏋
[mysqld]
skip-name-resolve
php杩灭▼杩炴帴MYSQL阃熷害鎱,链夋椂杩灭▼杩炴帴鍒癕YSQL鐢ㄦ椂4-20绉掍笉绛,链鍦拌繛鎺MYSQL姝e父,鍑虹幇杩欑嶉梾棰樼殑涓昏佸师锲犳槸,榛樿ゅ畨瑁呯殑MYSQL寮钖浜咲NS镄勫弽钖戣В鏋,鍦∕Y.INI(WINDOWS绯荤粺涓)鎴朚Y.CNF(UNIX鎴朙INUX绯荤粺涓)鏂囦欢镄刐mysqld]涓嫔姞鍏skip-name-resolve杩欎竴鍙ャ
浣嗘槸锛岃繖镙蜂细寮曡捣涓涓闂棰桡细杩炴帴mysql镞讹纴涓嶈兘浣跨敤 localhost杩炴帴浜嗭纴钥屾槸瑕佷娇鐢↖P鍦板潃镄勶绂濡傛灉鏄鎸塴ocalhost瀵圭敤鎴疯祴𨱒冮檺镄勮瘽锛岀敤鎴风橱褰曟潈闄愪篃瑕佷慨鏀逛竴涓嬬殑銆
杩炴帴mysql阃熷害鎱㈢殑瑙e喅鏂规硶.
2鍙版湇锷″櫒锛屼竴鍙拌窇iis+php锛屼竴鍙拌窇mysql锛屽拰浠ュ线涓镙烽厤缃濂界幆澧冿纴娴嬭瘯椤甸溃涓鍒唛K
璺戝簲鐢ㄧ殑镞跺椤彂鐜皃hp璁块梾mysql阃熷害寰堟参锛岃繖绉嶆儏鍐靛湪浠ュ墠浠庢湭鍙戠幇杩囷纴铏界劧2鍙版湇锷″櫒骞堕潪鍦ㄥ悓涓缃戞典腑锛屼絾鏄痯ing鏁板煎熀链涓婇兘鍦1,2ms涔嬮棿锛宼cp杩炴帴搴旇ヤ笉鏄闂棰桦叧锅ワ纴google浠ュ悗镓惧埌绛旀堬纴鍦╩y.ini鏂囦欢镄刐mysqld]閮ㄥ垎锷犲叆:skip-name-resolve锛屼缭瀛樻枃浠讹纴閲嶅惎mysql锛屼竴鍒唛K鍟︼纴阃熷害璞¢炰竴镙蜂简
鏂扮増链镄刴ysql閰岖疆璧锋潵涓嶈薄浠ュ墠镄勯偅涓鍌荤摐鍖栦简锛岃繖涓闂棰樻姌鑵句简鎴戜竴涓婂崃镄勬椂闂达纴鏅氢笂锲炴潵镐荤畻鏄瑙e喅浜嗭纴鍢垮樋锛屽张瀛﹀埌涓浜涗笢瑗裤
Windows 2003涓嬬殑MySQL 5链嶅姟鍣锛屾湰链鸿繛鎺ュ埌MySQL链嶅姟闱炲父蹇锛屽眬锘熺绣鍐呮湁涓ゅ彴Linux链哄櫒锛屾湁涓鍙拌繛鎺ュ緢蹇锛屽彟澶栦竴鍙拌緭鍏ュ瘑镰佸悗瑕佺瓑濂藉嚑绉挜挓镓嶈兘杩炰笂銆
瑙e喅锷炴硶锛
鍦∕ySQL链嶅姟鍣ㄧ殑閰岖疆涓澧炲姞涓涓濡备笅閰岖疆钖庨熷害椋炲揩銆
[mysqld]
skip-name-resolve
闄勫綍锛( How MySQL uses DNS )
When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the hostname cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
If the operating system doesn't support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.
You can disable DNS host lookup by starting mysqld with --skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.
If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with --skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.
You can disable the hostname cache with --skip-host-cache. You can clear the hostname cache with FLUSH HOSTS or mysqladmin flush-hosts.
If you don't want to allow connections over TCP/IP, you can do this by starting mysqld with --skip-networking.
PHP杩灭▼杩炴帴MYSQL阃熷害鎱,链夋椂杩灭▼杩炴帴鍒癕YSQL鐢ㄦ椂4-20绉掍笉绛,链鍦拌繛鎺MYSQL姝e父,鍑虹幇杩欑嶉梾棰樼殑涓昏佸师锲犳槸,榛樿ゅ畨瑁呯殑MYSQL寮钖浜咲NS镄勫弽钖戣В鏋,鍦∕Y.INI(WINDOWS绯荤粺涓)鎴朚Y.CNF(UNIX鎴朙INUX绯荤粺涓)鏂囦欢镄刐mysqld]涓嫔姞鍏skip-name-resolve杩欎竴鍙ャ
MYSQL杩灭▼杩炴帴阃熷害鎱㈢殑瑙e喅鏂规硶
鍦ㄥ眬锘熺绣鍐呰繛鎺ュ叾浠栨満鍣ㄧ殑MYSQL,鍙戠幇阃熷害鎱㈢殑寰,涓岖煡阆扑粈涔埚师锲,镐绘湁鍑犵掔殑寤惰繜.
钖庢潵鍦ㄧ绣涓婂彂鐜拌В鍐虫柟娉,my.ini閲岄溃娣诲姞
[mysqld]
skip-name-resolve
skip-grant-tables
杩欐牱阃熷害灏卞揩浜!
skip-name-resolve
阃夐”灏辫兘绂佺敤DNS瑙f瀽锛岃繛鎺ラ熷害浼氩揩寰埚氥备笉杩囷纴杩欐牱镄勮瘽灏变笉鑳藉湪MySQL镄勬巿𨱒冭〃涓浣跨敤涓绘満钖崭简钥屽彧鑳界敤ip镙煎纺銆
鑻ヤ娇鐢╛skip-grant-tables绯荤粺灏嗗逛换浣旷敤鎴风殑璁块梾涓嶅仛浠讳綍璁块梾鎺у埗锛屼絾鍙浠ョ敤 mysqladmin flush-privileges鎴杕ysqladmin reload𨱒ュ紑钖璁块梾鎺у埗;榛樿ゆ儏鍐垫槸show databases璇鍙ュ规墍链夌敤鎴峰紑鏀撅纴濡傛灉mysql链嶅姟鍣ㄦ病链夊紑杩灭▼甯愭埛锛屽氨鍦╩y.ini閲岄溃锷犱笂skip-grant-tables
② 关于MYSQL服务器突然变慢的问题
MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性,如果 MySQL 中包含了大量表,这个校验过程就会比较耗时。MySQL 下崩溃恢复确实和表数量有关,表总数越大,崩溃恢复时间越长。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低,因此面对大量的表空间,校验速度就非常缓慢。另外一个发现,MySQL 8 下正常启用时居然也会进行表空间校验,而故障恢复时则会额外再进行一次表空间校验,等于校验了 2 遍。不过 MySQL 8.0 里多了一个特性,即表数量超过 5W 时,会启用多线程扫描,加快表空间校验过程。
如何跳过校验MySQL 5.7 下有方法可以跳过崩溃恢复时的表空间校验过程嘛?查阅了资料,方法主要有两种:
配置 innodb_force_recovery可以使 srv_force_recovery != 0,那么 validate = false,即可以跳过表空间校验。实际测试的时候设置 innodb_force_recovery =1,也就是强制恢复跳过坏页,就可以跳过校验,然后重启就是正常启动了。通过这种临时方式可以避免崩溃恢复后非常耗时的表空间校验过程,快速启动 MySQL,个人目前暂时未发现有什么隐患。
2. 使用共享表空间替代独立表空间这样就不需要打开 N 个 ibd 文件了,只需要打开一个 ibdata 文件即可,大大节省了校验时间。自从听了姜老师讲过使用共享表空间替代独立表空间解决 drop 大表时性能抖动的原理后,感觉共享表空间在很多业务环境下,反而更有优势。
临时冒出另外一种解决想法,即用 GDB 调试崩溃恢复,通过临时修改 validate 变量值让 MySQL 跳过表空间验证过程,然后让 MySQL 正常关闭,重新启动就可以正常启动了。但是实际测试发现,如果以 debug 模式运行,确实可以临时修改 validate 变量,跳过表空间验证过程,但是 debug 模式下代码运行效率大打折扣,反而耗时更长。而以非 debug 模式运行,则无法修改 validate 变量,想法破灭。
③ MySQL数据库服务器逐渐变慢 该怎么分析与解决
我们先来看第一个阶段,MySQL慢的诊断思路,一般我们会从三个方向来做:
第一个方向是MySQL内部的观测
第二个方向是外部资源的观测
第三个方向是外部需求的改造
1.1 MySQL 内部观测
我们来看MySQL内部的观测,常用的观测手段是这样的,从上往下看,第一部分是Processlist,看一下哪个SQL压力不太正常,第二步是explain,解释一下它的执行计划,第三步我们要做Profilling,如果这个SQL能再执行一次的话, 就做一个Profilling,然后高级的DBA会直接动用performance_schema ,MySQL 5.7 以后直接动用sys_schema,sys_schema是一个视图,里面有便捷的各类信息,帮助大家来诊断性能。再高级一点,我们会动用innodb_metrics进行一个对引擎的诊断。
除了这些手段以外,大家还提出了一些乱七八糟的手段,我就不列在这了,这些是常规的一个MySQL的内部的状态观测的思路。除了这些以外,MySQL还陆陆续续提供了一些暴露自己状态的方案,但是这些方案并没有在实践中形成套路,原因是学习成本比较高。
1.2 外部资源观测
外部资源观测这部分,我引用了一篇文章,这篇文章的二维码我贴在上面了。这篇文章是国外的一个神写的,标题是:60秒的快速巡检,我们来看一下它在60秒之内对服务器到底做了一个什么样的巡检。一共十条命令,这是前五条,我们一条一条来看。
1.uptime,uptime告诉我们这个机器活了多久,以及它的平均的负载是多少。
2.dmesg -T | tail,告诉我们系统日志里边有没有什么报错。
3.vmstat 1,告诉我们虚拟内存的状态,页的换进换出有没有问题,swap有没有使用。
4. mpstat -P ALL,告诉我们CPU压力在各个核上是不是均匀的。
5.pidstat 1,告诉我们各个进程的对资源的占用大概是什么样子。
我们来看一下后五条:
首先是iostat-xz 1,查看IO的问题,然后是free-m内存使用率,之后两个sar,按设备网卡设备的维度,看一下网络的消耗状态,以及总体看TCP的使用率和错误率是多少。最后一条命令top,看一下大概的进程和线程的问题。
这个就是对于外部资源的诊断,这十条命令揭示了应该去诊断哪些外部资源。
1.3 外部需求改造
第三个诊断思路是外部的需求改造,我在这里引用了一篇文档,这篇文档是MySQL的官方文档中的一章,这一章叫Examples of Common Queries,文档中介绍了常规的SQL怎么写, 给出了一些例子。文章的链接二维码在slide上。
我们来看一下它其中提到的一个例子。
它做的事情是从一个表里边去选取,这张表有三列,article、dealer、price,选取每个作者的最贵的商品列在结果集中,这是它的最原始的SQL,非常符合业务的写法,但是它是个关联子查询。
关联子查询成本是很贵的,所以上面的文档会教你快速地把它转成一个非关联子查询,大家可以看到中间的子查询和外边的查询之间是没有关联性的。
第三步,会教大家直接把子查询拿掉,然后转成这样一个SQL,这个就叫业务改造,前后三个SQL的成本都不一样,把关联子查询拆掉的成本,拆掉以后SQL会跑得非常好,但这个SQL已经不能良好表义了,只有在诊断到SQL成本比较高的情况下才建议大家使用这种方式。
为什么它能够把一个关联子查询拆掉呢?
这背后的原理是关系代数,所有的SQL都可以被表达成等价的关系代数式,关系代数式之间有等价关系,这个等价关系通过变换可以把关联子查询拆掉。
上面的这篇文档是一个大学的教材,它从头教了关于代数和SQL之间的关系。然后一步步推导怎么去简化这句SQL。
第一,MySQL本身提供了很多命令来观察MySQL自身的各类状态,大家从上往下检一般能检到SQL的问题或者服务器的问题。
第二,从服务器的角度,我们从巡检的脚本角度入手,服务器的资源就这几种,观测手法也就那么几种,我们把服务器的资源全部都观察一圈就可以了。
第三,如果实在搞不定,需求方一定要按照数据库容易接受的方式去写SQL,这个成本会下降的非常快,这个是常规的MySQL慢的诊断思路。