- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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 个用户的数据(例如上传和下载速率、 session 状态等)。
表信息:描述“radacct”
从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”中的索引
谢谢
最佳答案
让我们从您的内部查询开始解决这个问题,即:
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
您正在寻找 username
的相等匹配和 acctstarttime
的范围匹配。然后,您将使用 acctuniqueid
对 radacctid
进行分组并提取极值 (MIN()
)。
因此,要加速这个子查询,就需要下面的复合索引。
(username, acctstarttime, acctuniqueid, radacctid)
这是如何运作的?将索引(这些是 BTREE 索引)视为其中值的排序列表。
username
的第一个条目和你的 BETWEEN
范围。
然后按顺序扫描列表,一个条目一个条目,直到它到达BETWEEN
范围的高端。这称为索引范围扫描。
扫描时,它会按顺序查找 acctuniqueid
的每个新值,然后取 radacctid
的最低值——按顺序第一个,然后向前跳到 accuniqueid
的下一个值。这称为松散索引扫描,而且它的成本低得惊人。
所以,添加那个复合索引。这可能会对您的查询性能产生重大影响。
您的外部查询如下所示。
SELECT sum(acctinputoctets) as upload,
sum(acctoutputoctets) as download
FROM radacct a
INNER JOIN ( /*an aggregate
* yielding acctuniqueid and raddactid
* naturally ordered on those two columns
*/
) b ON a.acctuniqueid = b.acctuniqueid
AND a.radacctid = b.radacctid
为此你需要复合覆盖索引
(acctuniqueid, radacctid, acctinputoctets, acctoutputoctets)
这部分查询也满足索引魔法。
- 索引中的前两列允许根据内部查询的结果查找您需要的每一行。
- 然后查询引擎可以扫描将其他两列的值相加的索引。
(这称为覆盖索引,因为它包含一些列,这些列的存在只是因为我们需要它们的值,而不是因为我们希望它们被索引。其他一些 DBMS 品牌和模型允许额外的列包含在索引中而不使它们可搜索。这有点便宜,尤其是在 INSERT
操作上。MySQL 不这样做。)
因此,您的第一个行动项目:添加这两个复合索引并重试您的查询。
从您的问题来看,您似乎在表中放置了很多单列索引,希望它们能加快处理速度。这是数据库设计中臭名昭著的反模式。尊重,你应该摆脱任何你不知道你需要的索引。它们对查询没有帮助,而且会减慢 INSERTS
的速度。这是您的第二个行动项目。
第三,去读这个http://use-the-index-luke.com/这非常有帮助。
专业提示:您看到我如何格式化您的查询了吗?当您必须理解一个查询的其他方面时,制定一个清晰显示表、列、ON
条件和查询的其他方面的个人格式约定非常重要。
关于针对大型 myisam 表的 MySQL 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37022941/
我有一个包含 21 个表的 mysql 数据库,所有表都有关系设置,我在 phpMyAdmin 中与设计师一起制作了它们。我很困惑,因为 MyISAM 不支持关系。除非有我找不到的更新。 是否有更新使
我有一个包含 MyISAM 和 InnoDB 表的 MyISAM 数据库,我想将此数据库迁移到另一台服务器,对于 MyISAM,只需复制 .frm .MYI 和 .MYD 即可,但对于 InnoDB
一:MySQL中MyISAM表损坏原因总结: 1、 服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。 2、 磁盘损坏。 3、 服务器死机。
我必须维护一个使用 MyISAM 引擎的 MySQL 数据库。现在数据库太大,每天备份占用空间很大。 我从数据库中删除了数百万条记录,但数据库大小没有减少,备份文件大小更大。 我应该使用 OPTIMI
我正在测试 innoDB 表中的事务支持,出于好奇,我尝试在 MyIsam 表上运行相同的事务,令人惊讶的是它成功了。我假设在 myIsam 表上查询是一个接一个地执行,而不是在一个原子操作中执行,并
各位 我需要从表A(大约6000万条记录和myisam存储引擎)生成一个报告。表 A 每 15 分钟转储一次 cdr 文件。 我想根据(日期至)和(日期自)生成报告 我尝试过的几个场景如下 1)我尝试
我在 Windows Server 2008(具有 4GB RAM)上使用 MySQL 5.1,并具有以下配置: 我有 2 个 MyISAM 表。其中一个位于 1 个数据库 (DB1) 中,有 14
我试图在 MariaDB10.0.14 上执行基准测试,以使用多个线程读取 MyISAM 表上的数据,但我不断收到与主键重复条目有关的异常。 MyISAM支持多线程读取吗?我使用sysbench进行基
我有一台具有 4GB RAM 和 400MB Mysql 数据库 (Myisam) 的单处理器专用服务器,该服务器存在很大的性能问题。该数据库由电子商务使用。我已经尝试使用 mysqltuner 脚本
多线程如何与 MyISAM 配合使用。因为它支持表级锁定?如果我们要求从同一张表中选择。线程在这种情况下如何工作 最佳答案 单独的连接获得单独的线程。单个连接不会使用多个线程。 (MyISAM 和 I
我有以下 2 个相同的表,使用 MySQL: DROP TABLE IF EXISTS `DB`.`tblNew`; CREATE TABLE `DB`.`tblNew` ( `NumberPK`
我可能忽略了一些简单的事情,但几周来我一直在试图了解这里出了什么问题,我需要一双新的眼睛。 我有一个处理 Paypal 付款通知的 CGI 应用程序。当有人订阅时,我实际上会获得一个订阅 IPN,然后
表不断崩溃错误 126 (HY000):表 './DB/Table.MYI' 的 key 文件不正确;尝试修复它 它确实通过修复表修复了,但问题再次出现!而且它的 5G 表需要约 45 分钟才能修复。
我可以使用在 MySQL 5.1.30 上运行的 MyISAM 表创建表空间吗? 最佳答案 表空间(在 MySQL 5.1 中)仅支持 NDB 和 NDBCLUSTER,参见 http://dev.m
基本上,我有一个 lang 表,其中包含 pg VARCHAR(20),id VARCHAR(20),en ( TEXT),ru (TEXT) 用于我的网站的多语言支持,在 99.999% 的情况下,
我的在线拍卖网站已经运行了近 3 年,并且仍然运行良好。三年内,如此多的拍卖已在服务器上列出并完成。但现在有很多负载在服务器上,因为数据库服务器上有很多已完成的现场拍卖。因此网站的性能不再是以前的样子
在 Mysql(5.7 及以上版本)中,用于表的更改跟踪,this approach实现起来非常简单。 但它需要版本表是 MyISAM,它执行表级锁定。 这种方法对于每秒发生多次插入/更新的生产系统是
假设我在 MyISAM 表上进行了一些操作(让它成为 INSERT),并附加了触发器。 我知道 MySQL 在运行此 INSERT 时会执行隐式表锁定。 问题:触发器会在这个隐式锁内部运行吗?触发器中
我有两个表,t1 和 t2,每个表有两列 - id_user 和 age。 如何将 t1.age 更新为 t1.age 和 t2.age 中的最大值以匹配 ID,并保留 t1.age 如果 t2 中没
我有一张测试表。测试表如下: CREATE TABLE `mytest` ( `num1` int(10) unsigned NOT NULL, KEY `key1` (`num1`) )
我是一名优秀的程序员,十分优秀!