MySQL性能检查和调优方法
1,指数未建立。
2,SQL太复杂,无法编写。
3、配置错误;
4,机器不能装。
1,指数未建立
如果你看到MySQL占用了大量的CPU,你可以用mysql的客户机工具来检查它。
执行在Linux
/ usr /局部/ MySQL /斌/ MySQL hlocalhost -中- P
输入密码。如果没有密码,则可以不带p参数进入客户端界面。
看看当前的操作
显示完整的列表
你可以多跑几次。
此命令可以看到当前执行的SQL语句,它将通知SQL、数据库名称、执行状态、客户机IP、帐户和运行时信息的执行情况。
在我的缓存后面,大多数时间没有看到任何SQL语句,我认为它更正常。
如果存在性能问题,可以进行分析。
1。你有SQL语句卡住吗
这是很多情况。如果数据库是MyISAM,这可能是一个写线程锁的数据表。如果此语句未完成,则其他语句无法运行。
看看时间项目进程表,看看有没有长的语句执行,并意识到这些语句。
2。正在执行大量相同的SQL语句。
如果发生这种情况,这是可能的,SQL语句执行效率低下,以及关注这些语句。
然后收集所有你所陈述的嫌疑人,并检查这些语句描述(解释)。
首先,看一个正常的降序输出:
MySQL > DESC SELECT * FROM IMGS哪里imgid = 1651768337;
+ -- + + + + ------------- ------- ------- --------------- + --------- + --------- + ------- ------ ------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------- --------------- + --------- + --------- + ------- ------ ------- + + +
| 1 |简单| IMGS const初级| | | | 8 | const | 1 | |
+ -- + + + + ------------- ------- ------- --------------- + --------- + --------- + ------- ------ ------- + + +
1行集(0秒)
注意键、行和额外的三项。这句话表明SQL将原主键索引,查询的结果集的数量是1,额外的不显示,证明没有排序或其他操作的使用。它可以推导出这个结果,MySQL查询imgid = 1651768337的指数,然后删除所有场的真正的表,这是一个非常简单的操作。
键表示当前的SQL将使用MySQL的索引,实现一个简单的语句可以用来索引A,注意限制;行是返回结果集的大小,结果集是使用索引进行搜索的所有匹配结果;额外将显示查询和排序的方式,。
如果不使用,或行是非常大的,用于filesort排序,它通常会影响效率,例如:
>描述MySQL SELECT * FROM IMGS其中UserID =7mini 为了点击属性10;
+ -- + + + + ------------- ------- ------ --------------- + ------ + --------- + ------ ------- ----------------------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------ --------------- + ------ + --------- + ------ ------- ----------------------------- + + +
| 1 |简单| IMGS |所有空空空| | | |空| 12506 |使用;使用filesort |
+ -- + + + + ------------- ------- ------ --------------- + ------ + --------- + ------ ------- ----------------------------- + + +
1行集(0秒)
这个SQL结果集12506,用于filesort,所以这将是非常有效的执行。在这个时候,MySQL执行时,它会扫描整个表,找到一个记录匹配用户名=7mini 一个接一个。然后我们需要对这些记录进行一次排序,效率是可以想象的。如果真正的执行速度更快,那是因为服务器的内存足够把所有12506个更短的记录读到内存中,所以速度更快,但如果并发较大或更大,效率就很严重。
在这一点上,我添加用户名的指数:
创建用户ID(用户名)IMGS指数;
然后再检查一遍:
>描述MySQL SELECT * FROM IMGS其中UserID =7mini 为了点击属性10;
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
| 1 |简单| IMGS REF用户名用户名| | | | 51 | const | 8 |使用;使用filesort |
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
1行集(0秒)
嗯,你可以看到MySQL使用用户标识索引搜索,和一个userid索引搜索后,结果有8个,虽然一个一个filesort使用,效率问题是缓解因为结果集只有8节。
但如果我使用其他用户名查询,结果也会不同:
>描述MySQL SELECT * FROM IMGS其中UserID =通过点击降序10管理命令;
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
| 1 |简单| IMGS REF用户名用户名| | | | 51 | const | 2944 |使用;使用filesort |
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
1行集(0秒)
这个结果基本上是作为=7mini 结果相同。然而,当MySQL用户名索引搜索,结果集的大小是2944。2944项将增加内存filesort,这比7mini更有效。你可以有两种解决方法,第一种方法是添加一个指标和条件,因为我只需要10次点击按最大的数据,所以有很多的数据,我不需要添加分类,如交通小于10,这些数据可能占大部分。
我添加一个索引点击,然后添加一个地方条件来查询它。
创建IMGS指数点击(点击);
>描述MySQL SELECT * FROM IMGS其中UserID =通过点击降序10管理命令;
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
| 1 |简单| IMGS | | REF的用户名,点击用户名| | 51 | const | 2944 |使用;使用filesort |
+ -- + + + + ------------- ------- ------ --------------- + -------- + --------- + ------- ------ ----------------------------- + + +
1行集(0秒)
然后你可以看到possible_keys为用户名,点击,possible_keys都指标能够判断possible_keys MySQL和采取的一个指标的执行语句,值得注意的是,该指数的MySQL应用并不一定是最佳的。这个查询MySQL或用户标识电缆查询使用,不根据我的意愿,这样的结果还是没有改变。改变SQL Plus使用索引强制MySQL使用点击指数:
>描述MySQL SELECT * FROM IMGS使用索引(点击)其中UserID = 'admin'and点击> 10
+ -- + + + + ------------- ------- ------- --------------- + -------- + --------- + ------ ------ ------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------- --------------- + -------- + --------- + ------ ------ ------------- + + +
| 1 |简单| IMGS范围点击点击| | | | 4 |空| 5455 |使用|
+ -- + + + + ------------- ------- ------- --------------- + -------- + --------- + ------ ------ ------------- + + +
1行集(0秒)
在这一点上,MySQL使用点击索引查询的结果集,但比用户名!似乎又被限制了。
>描述MySQL SELECT * FROM IMGS使用索引(点击)其中UserID = 'admin'and点击> 1000
+ -- + + + + ------------- ------- ------- --------------- + -------- + --------- + ------ ------ ------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------- --------------- + -------- + --------- + ------ ------ ------------- + + +
| 1 |简单| IMGS范围点击点击| | | | 4 |空| 312 |使用|
+ -- + + + + ------------- ------- ------- --------------- + -------- + --------- + ------ ------ ------------- + + +
1行集(0秒)
当结果添加到1000时,结果集变成312,并且排序效率应该是可接受的。
然而,通过使用索引优化,我们需要一个采样点,例如,在这个例子中的1000号,所以我们需要找到一个采样点为用户的每一个值,这是非常困难的程序。如果样品取样1000,那么结果'7mini'will UserID =不8,而是2,混淆用户。
当然,还有另一种添加双索引的方法:
创建索引(用户名,点击userid_clicks IMGS)
>描述MySQL SELECT * FROM IMGS其中UserID =通过点击降序10管理命令;
+ -- + + + + ------------- ------- ------ ---------------------- + --------------- + --------- + ------- ------ ------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------- ------ ---------------------- + --------------- + --------- + ------- ------ ------------- + + +
| 1 | SIMPLE | IMGs | | ref userid, userid_clicks userid_clicks | | 51 | const | 2944 | Using where |
+ -- + + + + ------------- ------- ------ ---------------------- + --------------- + --------- + ------- ------ ------------- + + +
1行集(0秒)
你可以看到,结果仍然是2944,但额外的filesort失踪了。在这个时候,MySQL使用userid_clicks索引查询,这不仅可以快速查询用户名为admin的所有记录
但是,多字段索引存在一个问题。如果有多种SQL,我们必须做好计划,否则,索引将被建立起来。它不仅会影响数据插入和更新的效率,而且容易破坏数据表。
以上是索引优化的方法,因为原因可能比较复杂,所以写得长,而且一般优化索引,MySQL的效率会提高n级,所以不需要增加机器来解决问题。
然而,MySQL或甚至所有的数据库可能不被限制的问题的好办法。在MySQL、限制、没有问题只要指数是合适的,但限制100000,10会非常缓慢,因为MySQL将扫描结果排序,找出100000点,以10的回报率。找到100000点,你要扫描100000条记录,这是耗费时间。不知道什么是一个好的算法可以优化扫描引擎,我想找到一个好的方法是什么,目前的限制,直到遥远的未来,我认为只有通过优化业务流程和数据表的规划,我认为这些优化措施尚未进一步讨论万全之策,回来。
2,SQL太复杂,无法编写
SQL是如果一些特殊的功能,如查询,或结合多表查询,MySQL采用什么方式来查询,也可以使用属性来分析,我这里复杂的SQL的情况并不太多,所以我不经常分析,有没有好的建议暂时。
3、配置错误
在配置的主要参数是key_buffer,sort_buffer_size / myisam_sort_buffer_size,与这两个参数的意思:
key_buffer = 128m:所有指数将在内存区是可能的,该指数是足够大的开大,我通常设置为128M,有一个好的建议是很少使用比较大的规模,转移到其他地方,这样可以显著减少MySQL内存使用。
sort_buffer_size = 1百万:一个线程用于分类存储,查询结果集将被放入内存,如果比较小,MySQL会放几次,所以一点也可以,是一个重要的优化指标和查询,所以不会产生一个结果集太大。
一些其他配置:
thread_concurrency = 8:这种配置有= CPU X2的数量
interactive_timeout = 30
wait_timeout = 30:这两种配置可用于10-30秒,这将释放内存资源,尽快。注意:已经使用的连接不会被破坏,这种配置只是一个很长的时间。
query_cache:不使用此功能。现在很多人看到缓存喜欢看到宝宝的信,这是不是唯物主义的,MySQL的query_cache将清理所有的表缓存,即使每一个表的数据变化。如果更新频繁,query_cache不仅将帮助而且对效率影响很大。此参数为只读数据库是合适的,如果它不被使用,它只能用一些SQL的query_cache_type = 2的sql_cache缓存。
max_connections:默认值为100。一般来说,它是足够的,但一般需要打开400-600。如果超过600,通常会产生效率问题。没有必要增加这个数字。
其他配置可以在默认情况下完成。就个人而言,问题并不那么严重。提醒我:1,配置非常重要,但在大多数情况下,效率问题不是主要原因。2、MySQL是数据库,最重要的研究不是数据库的效率,而是稳定性和数据的准确性。
4。这台机器不能装了。
如果上面的调整完成了,服务器仍然无法忍受,只能通过架构级别的调整来优化。
1,mysql同步。
数据通过MySQL同步函数从数据库同步到几个表,由主数据库编写,并从数据库中读取。
就个人而言,我不太高兴使用MySQL同步,因为这种方法会增加程序的复杂性,并且经常导致数据错误。在高负载服务中,崩溃可以很快重启,但如果数据出错,恢复起来就麻烦多了。
2。添加缓存
添加缓存后,并发问题就可以解决了,效果也很明显,如果是实时系统,您可以考虑使用刷新缓存使缓存保持最新状态。
提倡前端加鱿鱼的架构,在高命中率的应用中,基本上可以解决问题。
如果它被缓存在程序逻辑层中,它将增加很多复杂性。会有很多问题,很难解决。不建议在这个级别进行调整。
三.程序结构进行了调整,支持同时连接多个数据库。
如果Web正在缓存,问题仍然严重。它只能通过程序架构进行调整,分解应用程序,同时在多台机器上提供服务。
如果中断,对业务有一点影响,如果必须在所有的数据中使用一些业务功能,那么一个完整的n库库分发这样的库结构,完整库和库中的每一次修改都会分散每一次操作,或者定期组织一个完整的库。
当然,有一个愚蠢的方式来复制整个数据库完全。然后程序在任何时候执行这些库中的完整sql,并在访问时进行访问。我认为它比MySQL同步的方式更安全。
4。使用MySQL代理
MySQL代理可以通过代理将数据库中的每个表分散到多个服务器,但问题是它不能解决流行表的问题。如果热内容分散在多个表中,用这种方法就更容易解决问题。
我没有使用这个软件,也没有认真检查过它,但是我对它的功能有点怀疑,也就是说,它如何实现多个表之间的联合查询,如果可以实现,效率是多少
5。使用memcachedb
数据库切换支持MySQL的memcachedb是一个想法,可以尝试。它没有从memcachedb实现方式和水平的数据有任何影响,所以它不打扰用户。
因为我在数据库中没有很多问题,我没有测试它,但是,只要它支持MySQL的大多数主要语法,并且它本身是稳定的,可用性就不值得怀疑了。