【问题标题】:MariaDB copy table query runs quicker than original tableMariaDB 复制表查询比原始表运行得更快
【发布时间】:2015-07-08 10:06:52
【问题描述】:

场景是:

集群上的 Maria 数据库

我有一张表,每天更新两次,当我查询时需要 6-7 秒,(它不是超过 100k 行的大表),但是当我 制作表的副本并运行相同的查询返回 0.7 秒。

现在我尝试优化原始表,但没有运气。有 索引和 BTree。我有一种感觉,当复制一个表时,索引 可以说是直了。

有人有想法吗?我尝试了一些建议,但都没有成功。

(从评论中复制)

SELECT  SQL_NO_CACHE
        value1, tbl1.C, Src,
        GROUP_CONCAT( DISTINCT ROUND( tbl1.price, 4 )
            ORDER BY  tbl1.purdate DESC, tbl1.acttime DESC SEPARATOR ' - '
            ) AS purChase,
        CONCAT_WS (" ", curdef.country , curdef.currname) AS defin
    FROM  tbl1
    LEFT JOIN  curdef ON tbl1.curr = curdef.curr
    WHERE  purdate BETWEEN DATE_SUB("2015-07-06",INTERVAL 1 DAY) AND "2015-07-06"
      AND  curdef.curr_Def IS NOT NULL
      AND  BASE = "USD"
    GROUP BY  Curr,curdef.curr_id
    ORDER BY  tbl1.Curr ASC, tbl1.feeddate DESC;

这里是原始表的解释

SELECT Type =   SIMPLE                                                                             
TAble       =   curdef                                                                           
Type        =   ALL                                                                                            
possible Keys = null                                                                               
Key           = null                                                                           
Key Len     =   null                                                                           
ref         =   null                                                                                   
rows        =   195                                                                            
Extra       =   Using where; Using temporary; Using filesort

JOIN 表

SELECT Type =   SIMPLE  
TAble       =   tble1   
Type        =   ref                 
possible Keys = Curr,Base,Feeddate,Src  
Key           = Curr
Key Len     =   257     
ref         =   curdef.curr 
rows        =   343 

Extra       =   Using index condition; Using where

/*****************************************************************************/

这是复制表中的第二个解释表

SELECT Type =   SIMPLE  
TAble       =   curdef  
Type        =   ALL                 
possible Keys = null    
Key           = null
Key Len     =   null
ref         =   null        
rows        =   195 

Extra       =   Using where; Using temporary; Using filesort

/*****************************************************************************/

SELECT Type =   SIMPLE  
TAble       =   tbl1_test_01    
Type        =   range   
possible Keys = Curr,Base,Feeddate,Src  
Key           = Feeddate    
Key Len     =   3       
ref         =   null
rows        =   1462    

Extra       = Using index condition; Using where; Using join buffer (flat, BNL join)

/**************************************************** *******************************/

CREATE TABLE `tbl1` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Purchase` varchar(255) NOT NULL,
  `Rate` double NOT NULL,
  `Feeddate` date NOT NULL DEFAULT '0000-00-00',
  `Base` varchar(255) NOT NULL DEFAULT 'USD',
  `Acttime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Src` varchar(255) NOT NULL,
  `time` varchar(255) DEFAULT NULL,
  `actflag` char(255) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `Curr` (`Curr`),
  KEY `Base` (`Base`),
  KEY `Feeddate` (`Feeddate`),
  KEY `Src` (`Src`)
) ENGINE=InnoDB AUTO_INCREMENT=1911063 DEFAULT CHARSET=latin1

/**************************************************** *******************************/

CREATE TABLE `curdef` (
  `curr_Id` int(11) NOT NULL AUTO_INCREMENT,
  `curr` varchar(3) NOT NULL,
  `curr_Def` varchar(255) NOT NULL,
  `country` varchar(60) DEFAULT NULL,
  `currName` varchar(60) DEFAULT NULL,
  `Region` varchar(45) DEFAULT NULL,
  `country_code` varchar(3) DEFAULT NULL,
  PRIMARY KEY (`curr_Id`)
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=latin1'

/**************************************************** *******************************/

CREATE TABLE `tbl1_test_01` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Purchase` varchar(255) NOT NULL,
  `Rate` double NOT NULL,
  `Feeddate` date NOT NULL DEFAULT '0000-00-00',
  `Base` varchar(255) NOT NULL DEFAULT 'USD',
  `Acttime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
  `Src` varchar(255) NOT NULL,
  `time` varchar(255) DEFAULT NULL,
  `actflag` char(255) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `Curr` (`Curr`),
  KEY `Base` (`Base`),
  KEY `Feeddate` (`Feeddate`),
  KEY `Src` (`Src`)
) ENGINE=InnoDB AUTO_INCREMENT=1911063 DEFAULT CHARSET=latin1

所以这里是显示创建表,其中 tbl1 和 tbl1_test_01 连接到 curdef

【问题讨论】:

  • 您能提供更多信息吗?您有什么疑问?什么分析显示给你?
  • Anyalyze 说没问题,
  • SELECT SQL_NO_CACHE value1, tbl1.C, Src, GROUP_CONCAT( DISTINCT ROUND( tbl1.price, 4 ) ORDER BY tbl1.purdate DESC, tbl1.acttime DESC SEPARATOR ' - ' ) AS purChase, CONCAT_WS ( " ", curdef.country , curdef.currname) AS defin FROM tbl1 LEFT JOIN curdef ON tbl1.curr = curdef.curr WHERE purdate BETWEEN DATE_SUB("2015-07-06",INTERVAL 1 DAY) AND "2015-07-06 " AND curdef.curr_Def 不是 NULL AND BASE = "USD" GROUP BY Curr,curr_id ORDER BY tbl1.Curr ASC, tbl1.feeddate DESC;

标签: mysql mariadb clustered-index


【解决方案1】:

在制作表副本后,所有数据都位于缓存中。因此,它的运行速度提高了 10 倍。

让我们检查一下缓存大小。多少内存?哪个引擎? innodb_buffer_pool_size的值是多少?

请为两张表提供SHOW CREATE TABLE

请限定列名,以便我们知道每列在哪个表中。

如果BASEpurdate在同一张表中,这个复合索引可以加快查询速度(在复制表之前和之后):

INDEX(BASE, purdate)

如果您需要更多讨论,请提供EXPLAIN SELECT ...

编辑

副本似乎有更多索引。但它不一定有一个 composite 索引包含 both BASEpurdate

【讨论】:

  • 请将 EXPLAINs 和 SHOW CREATE TABLEs 添加到您的问题中,并以文明的方式格式化它们。
  • 对不起,我刚刚附加到原来的问题
  • 我还是看不到SHOW CREATE TABLE。我不知道哪个表有base 等。我不知道索引currfeeddate 中有哪些列。
  • 所以花了很长时间才放上来,但我认为你是对的它给人们,mysql.rjweb.org
  • 感谢插件。 :)
猜你喜欢
  • 2022-12-11
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多