2010-06-04 75 views
2

我的MySQL查詢看起來是這樣的:重寫查詢以刪除FIND_IN_SET?

SELECT pages.*, 
      showcase.*, 
      project.*  
     FROM pages 
INNER JOIN showcase ON showcase.pid = pages.uid AND showcase.deleted != 1 
INNER JOIN project ON FIND_IN_SET(project.uid, showcase.projects) 
    WHERE pages.deleted != 1 
     AND pages.pid = 14 
     AND pages.dokType = 150 

的問題是第二INNER JOIN - 它使用FIND_IN_SET因爲陳列櫃(=項目集合)存儲其項目爲逗號領域showcase.projects分隔的列表。據我所知,FIND_IN_SET無法使用索引,因此第二次連接需要對項目表進行全表掃描。在不更改數據庫方案的情況下使用索引的可能性?

回答

0

你在另一個字符串中尋找一個'字符串'你不得不做一個掃描,其他優化的方法是使用索引連接表,創建一個新表showcase_projects,它有project_idshowcase_id的列,然後這兩個表之間的每個關聯都會有一個記錄

現在這個答案是基於我對這個查詢的數據結構的原始理解。

+0

猜你是對的,我會在星期一開始正常化數據。當然是最好的解決方案。 – Max 2010-06-04 14:52:26

+0

祝你好運。只是不要在正常化的情況下下決心:)它可以在未來引入性能/處理數據問題。 – 2010-06-04 19:03:33

0

showcase.projects a VARCHAR?然後,你可以使用REGEXP這樣的:

... 
INNER JOIN project ON 
showcase.projects REGEXP CONCAT('[[:<:]]', project.uid, '[[:>:]]') 
WHERE ... 

這個表達式將查找全字(支架結構大關左右單詞邊界,分別但是,我不知道這將是能夠利用的。一個索引,也許有人可以想出更聰明的東西