【问题标题】:mysql join query is slow compared with mssqlmysql join查询比mssql慢
【发布时间】:2015-06-04 07:42:03
【问题描述】:

我有以下简单连接查询

SELECT
  count(*) 
FROM 
  DBx.caseview p2015
  INNER JOIN DBy.caseview p2014 ON p2015.casenumber=p2014.casenumber;

由于某种原因,它只会让 MySQL 挂在那里很长时间,直到我累了并取消它。相反,如果在 MSSQL 上使用相同的数据集运行完全相同的代码,则查询最多需要几秒钟。

是否有需要在 MySQL 上更改参数以加快此类查询的速度?

这是我在 MySQL 中的表

CREATE TABLE `caseview` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CASEID` varchar(18) DEFAULT NULL,
  `CASENUMBER` int(10) DEFAULT NULL,
  `ACCOUNTID` varchar(18) DEFAULT NULL,
  `ACCOUNT` varchar(256) DEFAULT NULL,
  `ASSETID` varchar(18) DEFAULT NULL,
  `SAPPRODUCTGROUP` varchar(10) DEFAULT NULL,
  `PRODUCT` varchar(128) DEFAULT NULL,
  `FAMILY` varchar(128) DEFAULT NULL,
  `CONTACTID` varchar(18) DEFAULT NULL,
  `OWNERID` varchar(18) DEFAULT NULL,
  `TYPE` varchar(128) DEFAULT NULL,
  `PRIORITY` varchar(24) DEFAULT NULL,
  `ORIGIN` varchar(24) DEFAULT NULL,
  `SUBJECT` varchar(256) DEFAULT NULL,
  `STATUS` varchar(24) DEFAULT NULL,
  `LASTACTIVITY` varchar(1024) DEFAULT NULL,
  `INITALDESCRIPTION` varchar(1024) DEFAULT NULL,
  `CLOSEDDATE` datetime DEFAULT NULL,
  `CREATEDDATE` datetime DEFAULT NULL,
  `LASTMODIFIEDDATE` datetime DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `ID_UNIQUE` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=122393 DEFAULT CHARSET=utf8;

有两个表和上面的配置完全相同,只是数据不同

DBx.caseview p2015 有 197647 行 DBy.caseview p2014 有 122392 行

【问题讨论】:

  • 正在使用哪些索引?此外,您可以使用 explain dev.mysql.com/doc/refman/5.7/en/explain.html 查看查询计划是什么。这将使您知道正在使用哪些索引。
  • 也许使用COUNT(field_Id)
  • @sqluser 会慢一些。
  • @efx 为两个表提供EXPLAIN + SHOW CREATE TABLE + 两个表中有多少行 + 多少行匹配。 PS:这不是一个“简单”的查询—​​—它是对整个表的扫描(虽然不是很明显)
  • 我很好奇 FROMJOIN 子句。 tablextabley 是不同的数据库吗?

标签: mysql sql


【解决方案1】:

CASENUMBER 字段创建索引。

ALTER TABLE `caseview` ADD INDEX ( `CASENUMBER` ) ;

给它几秒钟的时间来创建索引并再次运行查询。

【讨论】:

  • 好吧,我只是尝试将索引添加到我的测试环境中已经一个多小时了,进程仍在运行,需要多长时间?
  • 嗯,这取决于你有多少记录,你的硬件等等......但相信我,你需要它。
  • 好吧,我同意我需要它们,但是,我仍然问为什么没有它们的 mssql 可以在几秒钟内完成这项工作而 mysql 不能?即使索引在同一台机器/硬件上也需要相当长的时间
  • 可以开启mysql慢查询日志吗?也许它会变成一些东西。此外,自 mssql 2005 (blogs.msdn.com/b/bartd/archive/2007/07/19/…) 以来,mssql 一直在分析查询,并且新版本可能会根据它运行的 sql 创建内部索引,并获得他认为您想要的结果。此外,您需要在两个数据库中的该表中添加索引。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2019-08-02
相关资源
最近更新 更多