最近我的网站出现问题,mysql 负载达到 800%,大部分查询都卡在“排序结果”集中。
问题是我做了一个测试。具有 1 个结果集的相同查询,排序需要 9.8 秒,没有排序需要 0.02 秒。查询包含 where 条件和 group by。
优化了 sql,在索引字段中进行搜索,直到几天前一切正常。没有流量高峰,没有代码更改,什么都没有。
您过去是否遇到过这个问题,或者您知道我该如何解决它?
谢谢
编辑: 查询说明:
id: 1
select_type: SIMPLE
table: m
type: range
possible_keys: posterid_to_idx,to,poster_id
key: posterid_to_idx
key_len: 8
ref: NULL
rows: 6
Extra: Using where; Using filesort
同样,几天前同样的查询运行良好。
`id` int(11) NOT NULL AUTO_INCREMENT,
`body` longtext NOT NULL,
`poster_id` int(11) NOT NULL,
`poster_name` varchar(50) NOT NULL,
`to` int(11) NOT NULL,
`added` int(11) NOT NULL,
`picture` varchar(64) NOT NULL,
`folder` int(11) DEFAULT NULL,
`read` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `posterid_to_idx` (`poster_id`,`to`),
KEY `to` (`to`),
KEY `poster_id` (`poster_id`),
KEY `msg` (`id`,`poster_id`,`to`),
KEY `added` (`added`)
) ENGINE=InnoDB AUTO_INCREMENT=37548617 DEFAULT CHARSET=latin1
SELECT SQL_CALC_FOUND_ROWS m.body, m.id, m.poster_id, m.poster_name, m.to, m.added, m.picture, m.folder
FROM messages m
WHERE ((m.poster_id = '1885585' OR m.poster_id = '1886341')
AND (m.to = '1886341' OR m.to = '1885585'))
ORDER BY m.id DESC LIMIT 0, 10
顶级输出:
CPU: 6.0% user, 0.0% nice, 38.8% system, 0.2% interrupt, 55.0% idle
Mem: 11G Active, 1400M Inact, 5451M Wired, 87M Cache, 4923M Buf, 29G Free
Swap: 8000M Total, 8000M Free
最佳答案
所以在对 my.cnf 进行了大量尝试之后,我通过以下方式解决了这个问题:
降低查询缓存值
减小键缓冲区值
减少 tmp 表值
禁用性能模式
我刚刚测试了各种配置并且知道在全流量(大约 6000 人在线)下我的 mysql 保持 50% 的负载,这非常棒。没有进行任何 sql 或修改,只是 innodb 调整。
不太确定这是否是对有相同问题的人的答案,但至少这是我的答案。
我的.cnf
query_cache_limit=128M
query_cache_size=128M
query_cache_type=1
key_buffer_size=128M
tmp_table_size=64M
performance_schema=off
关于MySQL卡在排序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708991/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我想为我的Task模型创建一个status属性,该属性将按以下顺序指示它在三部分进度中的位置:打开=>进行中=>完成。它的工作方式类似于亚马逊包裹的交付方式:已订购=>已发货=>已交付。我想知道设置此属性的最佳方法是什么。我可能是错的,但创建三个独立的bool属性似乎有点多余。实现此目标的最佳方法是什么? 最佳答案 Rails4有一个内置的enummacro.它使用单个整数列并映射到键列表。classOrderenumstatus:[:ordered,:shipped,:delivered]end状态映射如下:{ordered:0,
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night
我想从rubyrake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我