【发布时间】: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 IN或NOT EXISTS,但都需要几乎相同的时间