2013-07-19 289 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

同一時間:( –