MySql vs MariaDB索引查询

时间:2015-12-23 08:31:18

标签: mysql indexing mariadb

我有一个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

谢谢

0 个答案:

没有答案