【问题标题】:SQL Query taking a long timeSQL 查询耗时较长
【发布时间】:2013-07-19 18:28:45
【问题描述】:

我正在尝试运行此查询

SELECT DISTINCT 
      t.class_name,
      t.class_code,
      @UTCTimeNow,
      @Username 
FROM 
      tblimport_n t
      LEFT JOIN classmaster_n cm ON t.class_code = cm.classcode
WHERE 
      cm.classcode IS NULL

但这需要很长时间(7-8 分钟)。这是当前状态

tblImport 包含 27k 条记录

tblImport 在 class_code 上有全文索引

classmaster_n 包含 27k 条记录

classmaster_n 在 classcode 上有索引

需要相当长的时间吗?我怀疑!

将来这两个表都可以有 10 万条记录!我害怕那个结果!

编辑:

我想要得到的是,来自tblImport 的所有记录,那些不在classmaster_n 中。

实际上我想插入数据库中不存在的所有类。我将使用此查询来插入记录。

编辑 2

tblImport_n 表中的FULLTEXT 索引类型更改为普通索引

解释我的查询显示了这个

id  select_type  table   type    possible_keys  key                      key_len  ref       rows  Extra                                 

 1  SIMPLE       t       ALL     (NULL)         (NULL)                   (NULL)   (NULL)   27071                                        
 1  SIMPLE       cm      index   (NULL)         i_Classmaster_Classcode  202      (NULL)   27251  Using where; Using index; Not exists  

tblImport_n

CREATE TABLE `tblimport_n` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `SCHOOL_CODE` varchar(50) DEFAULT NULL,
  `SCHOOL_NAME` varchar(300) DEFAULT NULL,
  `CLASS_CODE` varchar(50) DEFAULT NULL,
  `CLASS_NAME` varchar(300) DEFAULT NULL,
  `TEACHER_EMPLOYEE_CODE` varchar(50) DEFAULT NULL,
  `TEACHER_TITLE` varchar(300) DEFAULT NULL,
  `TEACHER_FIRSTNAME` varchar(300) DEFAULT NULL,
  `TEACHER_MIDDLENAME` varchar(300) DEFAULT NULL,
  `TEACHER_LASTNAME` varchar(300) DEFAULT NULL,
  `TEACHER_EMAIL_ADDRESS` varchar(300) DEFAULT NULL,
  `STAFF_CODE` varchar(300) DEFAULT NULL,
  `STUDENT_CODE` varchar(50) DEFAULT NULL,
  `STUDENT_FIRSTNAME` varchar(300) DEFAULT NULL,
  `STUDENT_MIDDLENAME` varchar(300) DEFAULT NULL,
  `STUDENT_LASTNAME` varchar(300) DEFAULT NULL,
  `STUDENT_GRADE` varchar(300) DEFAULT NULL,
  `STUDENT_GENDER` varchar(300) DEFAULT NULL,
  `STUDENT_BIRTH_DATE` varchar(300) DEFAULT NULL,
  `STUDENT_HOMEROOM` varchar(300) DEFAULT NULL,
  `STUDENT_IEP_STATUS` varchar(300) DEFAULT NULL,
  `STUDENT_LEP_STATUS` varchar(300) DEFAULT NULL,
  `STUDENT_LEP_Year` varchar(300) DEFAULT NULL,
  `STUDENT_RACE` varchar(300) DEFAULT NULL,
  `STUDENT_LANGUAGE` varchar(300) DEFAULT NULL,
  `STUDENT_NETWORK` varchar(300) DEFAULT NULL,
  `STUDENT_ACCOMMODATIONS` varchar(300) DEFAULT NULL,
  `DISTRICTID` int(10) DEFAULT NULL,
  `TMD5hash` varchar(1500) DEFAULT NULL,
  `SMD5hash` varchar(1500) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `i1` (`CLASS_CODE`),
  KEY `i2` (`SCHOOL_CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=32768 DEFAULT CHARSET=utf8

classmaster_n

CREATE TABLE `classmaster_n` (
  `ClassId` int(11) NOT NULL AUTO_INCREMENT,
  `ClassName` varchar(200) NOT NULL,
  `ClassCode` varchar(200) NOT NULL,
  `CreatedDate` datetime DEFAULT NULL,
  `CreatedUser` varchar(100) DEFAULT NULL,
  `UpdatedDate` datetime DEFAULT NULL,
  `UpdatedUser` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ClassId`),
  KEY `i_Classmaster_Classcode` (`ClassCode`)
) ENGINE=InnoDB AUTO_INCREMENT=35094 DEFAULT CHARSET=latin1

编辑 3

我想我成功了!!!

我刚刚将 tblImport_n.Class_Code 更改为非空列,查询只用了 27 秒!!

我仍在测试所有案例...

【问题讨论】:

  • @UTCTimeNow@Username 是什么?
  • 您正在使用 cm.classcode 加入,但要求 cm.classcode 为空?我猜这是一个表扫描。你能说更多关于你正在尝试做的事情吗>
  • 您确定需要在“代码”上使用 FULLTEXT 索引吗?这似乎很奇怪。
  • @echo_Me - 实际上这条语句在存储过程中,@UTCTimeNow@Username 是变量。我将使用此结果集插入其中一个表中。
  • @asantaballa - 实际上我想获取所有在tblImport 中但不在classmaster_n 中的记录。实际上试图实现MINUS。还有其他方法,例如使用NOT INNOT EXISTS,但都需要几乎相同的时间

标签: mysql sql


【解决方案1】:

尝试使用 NOT EXISTS 子句:

SELECT DISTINCT 
      t.class_name,
      t.class_code,
      @UTCTimeNow,
      @Username 
FROM tblimport_n t
WHERE NOT EXISTS
(SELECT 'X' FROM classmaster_n cm WHERE t.class_code = cm.classcode)

因为您的 LEFT JOIN 与 WHERE 条件在 classcode 上是一样的

【讨论】:

  • 我已经尝试过了,但花费的时间相同。我在我的一个 cmets 中提到过
  • 对不起,我们同时发布了我们的cmets。您是否尝试过在类代码上使用索引? DISTINCT 有用吗?我通过您的查询复制了 DISTINCT,但 peraphs 没有用
  • classcode上有索引。实际上是的,我需要不同的记录
  • 我们尝试另一种方法:我希望速度更快。第 1 步:创建一个临时表,以这种方式在其中放置 select distinct class_name class_code:SELECT DISTINCT class_name, class_code from tbimport_n。通过 2:使用不存在的班主任调整新表之后
【解决方案2】:

试试这个

    SELECT 
  t.class_name,
  t.class_code,
  @UTCTimeNow,
  @Username 
FROM 
  tblimport_n t
  LEFT JOIN classmaster_n cm ON t.class_code = cm.classcode
WHERE 
  cm.classcode IS NULL
group by  t.class_name, t.class_code

【讨论】:

  • 同一时间:(
猜你喜欢
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多