我正在尝试运行此查询

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在类代码上具有索引

是否需要花费大量时间?我怀疑!

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

编辑:

我要获取的是,所有来自tblImport的记录,这些记录都不在classmaster_n中。

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

编辑2

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

解释我的查询显示此

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更改为非null列,而查询只花了27秒!

我还在测试所有情况...

最佳答案

尝试使用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条件为null是同一回事

10-07 21:21