2013-07-19 244 views
0

我试图运行此查询SQL查询花费很长的时间

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

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

EDIT 2

改变FULLTEXTtblImport _n表中的索引类型普通索引

解释我的查询显示该

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秒!

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

+0

什么是@ UTCTimeNow和@ @用户名? –

+3

您正在使用cm.classcode加入,但要求cm.classcode为空?我猜这是一个表扫描。你能说更多关于你想要做什么吗?> – asantaballa

+0

你确定你需要一个'代码'的FULLTEXT索引。这似乎很奇怪。 – Strawberry

回答

1

与不尝试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) 

因为你留下凡classcode条件为空连接是一回事

+0

我已经尝试了这一点,但它采取了同一时间。我在其中的一条评论中提到了 –

+0

对不起,我们在同一时间发布了我们的评论。你有没有尝试索引类代码? DISTINCT有用吗?我复制DISTINCT通过您的查询,但peraphs是无用的 –

+0

有类索引上的索引。其实是的,我需要清晰的记录 –

0

试试这个

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 
+0

同一时间:( –