MySql与MariaDB索引查询
我有一个mysql数据库5.1.73-0 ubuntu0.10.04.1-log,它在0,1秒内运行这句话:MySql与MariaDB索引查询,mysql,indexing,mariadb,Mysql,Indexing,Mariadb,我有一个mysql数据库5.1.73-0 ubuntu0.10.04.1-log,它在0,1秒内运行这句话: select date_format(if(isnull(acctstoptime),CURDATE(),acctstoptime), '%Y-%m-%d') as fecha ,count(* ) from radacct where radacct.username like '%_ins_98
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,1秒:
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转储
我尝试过分析表,强制索引,但没有一个能像mysql那样运行查询
我还能查什么
****编辑***
我尝试过SQL\u NO\u缓存,结果也一样
这些表与我对数据库进行的完全恢复完全相同
显示创建表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
并显示“创建表”对话框:
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
谢谢表中的数据似乎多得多。对吗?嗨,帕特里克,数据完全一样。只需从mysql中转储并恢复到mariadb即可。所以两个数据库上的行都是相同的。是否有可能因为缓存的原因,您在旧服务器上获得了超快的查询结果?在两台服务器上尝试
选择SQL\u NO\u CACHE which
;确保您准确地测量了查询时间。另外,请向我们显示新服务器上的show CREATE TABLE
中查询所涉及的所有表的输出。我的理论是,索引的设置可能不一样。如果可能,让我们看看5.1的SHOW CREATE TABLE
。注意(在解释中)5.1使用了索引;10.1没有。这是差异的根源,而不是子查询。