最近我的网站出现问题,mysql负载达到800%,大多数查询都停留在“排序结果”集中。
问题是我做了一个测试。具有1个结果集的相同查询,排序花费了9,8秒而没有花费0.02秒。该查询包含条件和分组的位置。
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
答案 0 :(得分:1)
所以经过my.cnf的大量试用后,我通过以下方式解决了问题:
降低查询缓存值
减少密钥缓冲区值
减少tmp表值
已停用的效果架构
我刚刚测试了各种配置并且知道完全流量(大约6k人在线)我的mysql保持50%的负载,这非常棒。没有sql或修改,只是innodb调整。
不确定这是否是具有相同问题的人的答案,但至少是我的答案。
在my.cnf
query_cache_limit=128M
query_cache_size=128M
query_cache_type=1
key_buffer_size=128M
tmp_table_size=64M
performance_schema=off