OS=centos 6.7 [Dedicated server]
memory=15G
cpu=Intel(R) Xeon(R) CPU E5-2403
mysql= V 5.1.73
这里是一个MyISAM表,包含大约500万行数据。每5-6分钟插入大约3000名用户的数据(例如上传和下载速率、会话状态等)。
表信息:描述"radacct“
my.cnf
从mysql慢速查询日志中,最耗时的查询之一如下
Query_time: 7.941773 Lock_time: 0.155912 Rows_sent: 1 Rows_examined: 5377
use freeradius;
SET timestamp=1461582118;
SELECT sum(acctinputoctets) as upload,
sum(acctoutputoctets) as download
FROM radacct a
INNER JOIN (SELECT acctuniqueid, MIN( radacctid ) radacctid
FROM radacct
WHERE username='batman215'
and acctstarttime between '2016-02-03 12:10:47'
and '2016-04-25 16:46:01'
GROUP BY acctuniqueid) b
ON a.acctuniqueid = b.acctuniqueid
AND a.radacctid = b.radacctid;
解释查询输出
当有许多用户试图查看他们消耗的带宽时,由于负载和IO太高,服务器无法满足请求。我能做些什么来进一步优化数据库吗?
表"radacct“中的索引
不使用\G解释查询
谢谢你
发布于 2016-12-08 23:09:30
WHERE username='batman215'
and acctstarttime between ...
按照这个顺序请求INDEX(username, acctstarttime)
。
ON a.acctuniqueid = b.acctuniqueid
AND a.radacctid = b.radacctid;
请求INDEX(acctuniqueid, radacctid)
(按两种顺序)(或Ollie的覆盖指数)。
“每5-6分钟,就会插入大约3000个用户的数据”请求InnoDB而不是MyISAM。MyISAM会进行表锁,从而使“插入”干扰其他查询。http://mysql.rjweb.org/doc.php/myisam2innodb。
https://stackoverflow.com/questions/37022941
复制相似问题