MySql与MariaDB索引查询

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

我有一个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\_%'
      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没有。这是差异的根源,而不是子查询。