mysql - MySQL 连接查询莫名其妙的慢

标签 mysql sql

我有一个非常简单的查询,但由于执行时间很长而令我头疼,我无法解释。查询:

explain select A.* from NAV_ADRESSEN A left outer join MITGL_KENNZEICHEN K on (K.MNR=A.MNR)
where ((A.MNR='19012546') or (IMPORTID='19012546') or (K.KENNZEICHEN='19012546')) and 
(not UNGUELTIG) order by ZUNAME, VORNAME limit 0, 25;

无论是否找到任何匹配项,查询(真正的查询,而不是解释)大约需要 17 秒。

解释结果:

id  select_type table   type    possible_keys   key     key_len ref             rows Extra
1   SIMPLE      A       index   MNR,IMPORTID    ZUNAME  164     NULL            25   Using where
1   SIMPLE      K       ref     MNR             MNR     23      gsco-test.A.MNR 1    Using where

这对我来说看起来很正常。所有相关列都有键(A.MNR、K.MNR、A.IMPORTID、K.KENNZEICHEN);这些表包含约 600 000 行 (NAV_ADRESSEN) 和 180 行 (MITGL_KENNZEICHEN)。

可能是什么问题?

编辑添加:

当省略 limit 子句时,解释看起来略有不同(但执行时间加倍):

id  select_type  table  type  possible_keys  key   key_len  ref              rows    Extra                        
1   SIMPLE       A      ALL   MNR,IMPORTID   NULL  NULL     NULL             544587  Using where; Using filesort  
1   SIMPLE       K      ref   MNR            MNR   23       gsco-test.A.MNR  1       Using where                  

表定义:

CREATE TABLE `MITGL_KENNZEICHEN` (
  `PK` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `MNR` varchar(20) DEFAULT NULL,
  `KENNZEICHEN` varchar(80) DEFAULT NULL,
  `DESCRIPTION` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`PK`),
  KEY `MNR` (`MNR`),
  KEY `KENNZEICHEN` (`KENNZEICHEN`)
) ENGINE=InnoDB AUTO_INCREMENT=247 DEFAULT CHARSET=latin1;

...和...

CREATE TABLE `NAV_ADRESSEN` (
  `PK` int(11) NOT NULL AUTO_INCREMENT,
  `MNR` varchar(20) NOT NULL,
-- ... 50 fields omitted for brevity ...
  `UNGUELTIG` tinyint(1) NOT NULL,
  `IMPORTID` varchar(20) NOT NULL,
  `MATCHCODE` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`PK`),
  UNIQUE KEY `MNR` (`MNR`),
  KEY `ZUNAME` (`ZUNAME`,`VORNAME`),
  KEY `IMPORTID` (`IMPORTID`),
  KEY `MATCHCODE` (`MATCHCODE`),
  KEY `ANGELEGTDAT` (`ANGELEGTDAT`)
) ENGINE=InnoDB AUTO_INCREMENT=1076829 DEFAULT CHARSET=latin1;

最佳答案

仅供引用,该查询(大概)可以重写如下:

SELECT a.* 
  FROM nav_adressen a
  JOIN mitgl_kennzeichen k
    ON k.mnr = a.mnr
   AND 19012546 IN (a.mnr,importid,k.kennzeichen)
   AND NOT ungueltid 
 ORDER 
    BY zuname
     , vorname 
 LIMIT 0,25;

关于mysql - MySQL 连接查询莫名其妙的慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608697/

相关文章:

mysql获取最近7次失败交易的所有卡记录

php - 如何将自托管的 wordpress 和 live 站点的已安装插件升级到最新可用版本而不会遇到任何问题?

sql - PostgreSQL - 相关子查询失败?

sql - 根据匹配的正则表达式从 postgresql 数据库中删除

sql - ORA-00911 : invalid character - When running SQL dump

Mysql 包含字符串来获取列中的特定字符串

C++ Boost 将 UNIX 时间戳转换为 MySQL 兼容的 DATETIME 字符串

sql - Spark sql 中的广播连接(Spark 1.6.2)

没有聚合的sql pivot

mysql - 如何正确获取图表值统计