2012-01-30 64 views
0

讓我開始說我有一個excel spreedsheet,其中包含所有我的數據在調用catelogue中。它有27個領域。隨着數據重複,這些字段中的很多可以拆分成單獨的表格。我把這個表導入到mysql作爲一個CSV文件,當我用wamp進行測試時,它工作正常。在mysql中有兩個表格,一個是我已經解釋過的,另一個是tracklisting。這有很多記錄鏈接到catelogue表。我有我的SQL看起來像這樣以搜索爲什麼我的搜索在我的主機上很慢?

SELECT `ARTIST` , `TITLE` , `CAT NO.` , `FORMAT` , `DEPARTMENT` , 
`SELL`,`IMAGE PATH`,`RELEASEDATE` 
FROM catelogue 
WHERE `DEPARTMENT` LIKE 'MUSIC' 
AND (`ARTIST` LIKE '%$theValue%' OR `TITLE` LIKE '%$theValue%' OR `CAT NO. IN 
(SELECT * FROM tracklisting 
WHERE `ARTIST` LIKE '%$theValue%' OR `TRACKTITLE`LIKE '%$theValue%') 
    ORDER BY `RELEASEDATE` DESC 

是的,這完美地工作,因爲我怎麼想它的工作,但unfortunataly它沒有我的主機服務器上的所有工作。

所以我轉移到這個與幫助從這裏幾個傢伙在堆棧溢出

SELECT * 
FROM catelogue c 
    LEFT JOIN tracklisting t 
     ON t.`TRACKLISTING CAT NO.` = c.`CAT NO.` 
WHERE `DEPARTMENT` = 'MUSIC' 
     AND (( c.'ARTIST' LIKE '%$theValue%' OR c.'TITLE' LIKE '%$theValue%') 
       OR 
       (t.`ARTIST` LIKE '%$theValue%' OR t.`TRACK TITLE` LIKE '%$theValue%')) 
ORDER BY `RELEASEDATE` DESC 

現在,這的確在時尚工作,但被退回每一個有一個曲目的項目怎麼過許多曲目有是爲那張專輯製作的。 Lady Gaga 15首曲目和15首重複曲目。現在沒有人反對那些幫助我的人,我非常喜歡幫助,這比我的原始速度快,但它仍然需要一段時間。它沒有加載頁面,但沒有我想要的那麼快。

我已經搬到這只是讓我的搜索速度不夠快,但它不搜索我tracklistings。

SELECT `ARTIST` , `TITLE` , `CAT NO.` , `FORMAT` , `DEPARTMENT` , `SELL`,`IMAGE PATH`,`RELEASEDATE` 
FROM catelogue 
WHERE `DEPARTMENT` LIKE 'MUSIC' 
AND (`ARTIST` LIKE '%$theValue%' OR `TITLE` LIKE '%$theValue%') 
    ORDER BY `RELEASEDATE` DESC" 

所以我的問題是,如何得到一個SQL語句,將搜索我的catelogue和我的曲目沒有采取永遠這樣做或返回重複。如果第2搜索和返回的CAT NO

將3個獨立的querys工作得更快。成一個數組,然後在PHP中使用foreach語句的第三個?

所有我的數據庫的保存爲InnoDB的。

感謝

道歉反應慢

因此,一個更新

我跑了一下測試自己的。 Duno可能有多有效,但通過使用IN語句的原始查詢,我的本地主機使用wamp時需要0.3到0.4秒。

的加入似乎大致同時服用。不同的也是一樣的。第一個明顯花了一秒鐘,但之後,它運行在.3或.4倍

我最後一個簡單的查詢沒有連接或In只是搜索一個表大約需要0.1秒。

現在我不知道這個,但這看起來很快。

在主機服務器上工作的唯一查詢是基本的查詢。插入也工作正常,但它也很簡單。

所以我的新問題。

我的ISP是愚蠢的,不允許我的SQL中的任何連接或In的,只是凍結,告訴你你不能做什麼?

+1

您可以使用myisam的表格並使用全文搜索 – dynamic 2012-01-30 14:31:08

+0

@ yes123:我認爲這不會起作用。馬克的所有條件都是'LIKE'%___%''。術語開頭的通配符使全文索引無用。 – 2012-01-30 14:38:56

+0

@Ben:全文有BOOLEAN SEARCH可以複製,肯定可以更快 – dynamic 2012-01-30 17:41:00

回答

0

試試這個來消除重複。由於返回更少的數據,你會發現它也更快:

SELECT distinct c.* 
FROM catelogue c 
LEFT JOIN tracklisting t ON t.`TRACKLISTING CAT NO.` = c.`CAT NO.` 
WHERE `DEPARTMENT` = 'MUSIC' 
    AND ((c.'ARTIST' LIKE '%$theValue%' OR c.'TITLE' LIKE '%$theValue%') 
     OR 
     (t.`ARTIST` LIKE '%$theValue%' OR t.`TRACK TITLE` LIKE '%$theValue%')) 
ORDER BY `RELEASEDATE` DESC 
0

最大的問題在這裏打球是MySQL不能使用任何索引來加快與通配符開頭的查詢。任何其他數據庫服務器都不能。它需要全表表掃描來查找每個可能的結果。添加訂單聲明,並強制掃描沒有提前退出條件的所有內容。

您可以使用MySQL全文檢索,這是很容易的,因爲它是始終可用,或使用外部的全文檢索工具,如獅身人面像,ElasticSearch,Solr的,還是其他什麼東西。有很多選擇。

否則,您也可以自己完成這項工作,方法是擁有單詞表並將您的內容編入索引。不過,我不會推薦這個選項。

0

你可以把

SELECT * 
FROM catelogue c 
WHERE c.`DEPARTMENT` = 'MUSIC' 
    AND (( c.'ARTIST' LIKE '%$theValue%' OR c.'TITLE' LIKE '%$theValue%') 

SELECT * 
FROM tracklisting t 
WHERE 
    (t.`ARTIST` LIKE '%$theValue%' OR t.`TRACK TITLE` LIKE '%$theValue%')) 

兩個臨時表,然後LEFT JOIN,DISTINCT做和ORDER BY這兩個tempoprary表。

相關問題