我有一个mysql数据库5.1.73-0 ubuntu0.10.04.1-log在0,1 s中运行这句话:
select date_format(if(isnull(acctstoptime),CURDATE(),acctstoptime),
'%Y-%m-%d') as fecha ,count(*
)
from radacct
where radacct.username like '%_ins_98\_%'
and ((acctstoptime)>=
( SELECT max(fFecNav)+ INTERVAL 1 day as fFecNav
from swb_NavegaDias
where idInstalacion=98
)
or isnull(acctstoptime)
)
group by if(isnull(acctstoptime),CURDATE(),date(acctstoptime))
order by acctstoptime;
解释
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY radacct range acctstoptime acctstoptime 9 8646 Using where; Using temporary; Using filesort
2 SUBQUERY swb_NavegaDias ALL 54400 Using where
然后我在MariaDB 10.1.8-MariaDB-log CentOS7上进行mysql转储和更新
并且相同的查询需要5秒才能执行。
解释
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY radacct ALL acctstoptime 4621901 Using where; Using temporary; Using filesort
2 SUBQUERY swb_NavegaDias ALL 53946 Using where
问题是子查询,即执行单个查询需要0,06秒,但使主要查询速度变慢。
select max(fFecNav)+ INTERVAL 1 day as fFecNav from swb_NavegaDias where idInstalacion=98;
如果我在没有子查询的情况下更改主查询,则需要0,1s:
select date_format(if(isnull(acctstoptime),CURDATE(),acctstoptime),
'%Y-%m-%d') as fecha ,count(*
)
from radacct
where radacct.username like '%_ins_98\_%'
and ((acctstoptime)>= '2015-12-20'
or isnull(acctstoptime)
)
group by if(isnull(acctstoptime),CURDATE(),date(acctstoptime))
order by acctstoptime;
两个数据库中的表定义完全相同..因为我已经完成了mysql转储。
我尝试过ANALYZE TABLE,强制索引,但没有一个像mysql一样运行查询。
我还能检查什么?
****已编辑***
我尝试过使用SQL_NO_CACHE和相同的结果。
这些表与我完全恢复数据库完全相同。
显示创建表Mysql:
CREATE TABLE `radacct` (
`radacctid` bigint(21) NOT NULL AUTO_INCREMENT,
`acctsessionid` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`acctuniqueid` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`username` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`groupname` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`realm` varchar(64) COLLATE utf8_unicode_ci DEFAULT '',
`nasipaddress` varchar(15) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`nasportid` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`nasporttype` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`acctstarttime` datetime DEFAULT NULL,
`acctstoptime` datetime DEFAULT NULL,
`acctsessiontime` int(12) DEFAULT NULL,
`acctauthentic` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`connectinfo_start` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`connectinfo_stop` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`acctinputoctets` bigint(20) DEFAULT NULL,
`acctoutputoctets` bigint(20) DEFAULT NULL,
`calledstationid` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`callingstationid` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`acctterminatecause` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`servicetype` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`framedprotocol` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`framedipaddress` varchar(15) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`acctstartdelay` int(12) DEFAULT NULL,
`acctstopdelay` int(12) DEFAULT NULL,
`xascendsessionsvrkey` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`radacctid`),
KEY `framedipaddress` (`framedipaddress`),
KEY `acctsessionid` (`acctsessionid`),
KEY `acctsessiontime` (`acctsessiontime`),
KEY `acctuniqueid` (`acctuniqueid`),
KEY `acctstarttime` (`acctstarttime`),
KEY `acctstoptime` (`acctstoptime`),
KEY `nasipaddress` (`nasipaddress`),
KEY `username` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=8162219 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
显示创建表MariaDB:
CREATE TABLE `radacct` (
`radacctid` bigint(21) NOT NULL AUTO_INCREMENT,
`acctsessionid` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`acctuniqueid` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`username` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`groupname` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`realm` varchar(64) COLLATE utf8_unicode_ci DEFAULT '',
`nasipaddress` varchar(15) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`nasportid` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`nasporttype` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`acctstarttime` datetime DEFAULT NULL,
`acctstoptime` datetime DEFAULT NULL,
`acctsessiontime` int(12) DEFAULT NULL,
`acctauthentic` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`connectinfo_start` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`connectinfo_stop` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`acctinputoctets` bigint(20) DEFAULT NULL,
`acctoutputoctets` bigint(20) DEFAULT NULL,
`calledstationid` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`callingstationid` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`acctterminatecause` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`servicetype` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`framedprotocol` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`framedipaddress` varchar(15) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`acctstartdelay` int(12) DEFAULT NULL,
`acctstopdelay` int(12) DEFAULT NULL,
`xascendsessionsvrkey` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`radacctid`),
KEY `framedipaddress` (`framedipaddress`),
KEY `acctsessionid` (`acctsessionid`),
KEY `acctsessiontime` (`acctsessiontime`),
KEY `acctuniqueid` (`acctuniqueid`),
KEY `acctstarttime` (`acctstarttime`),
KEY `acctstoptime` (`acctstoptime`),
KEY `nasipaddress` (`nasipaddress`),
KEY `username` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=8162213 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
谢谢