2011-11-05 27 views
1

我使用下面的MySQL查詢其工作正常,我指給我所需要的輸出,但...讓我們先看到查詢:如何調整以下MySQL查詢?

select 
    fl.file_ID, 
    length(fl.filedesc) as l, 
    case 
     when 
      fl.part_no is null 
      and l>60 
      then concat(fl.fileno,' ', left(fl.filedesc, 60),'...') 
     when 
      fl.part_no is null 
      and length(fl.filedesc)<=60 
      then concat(fl.fileno,' ',fl.filedesc) 
     when 
      fl.part_no is not null 
      and length(fl.filedesc)>60 
      then concat(fl.fileno,'(',fl.part_no,')', left(fl.filedesc, 60),'...')  
     when 
      fl.part_no is not null 
      and length(fl.filedesc)<=60 
      then concat(fl.fileno,'(',fl.part_no,')',fl.filedesc) 
     end as filedesc 
from filelist fl 

我不想重複,因爲使用的長度函數我想它會在每次聲明性能問題時觸及數據庫。請建議,如果我可以存儲一次,並使用它幾次。

+0

我沒有看到PHP與它有什麼關係。 –

+0

您已經嘗試過使用'l';結果是什麼? –

+0

它看起來應該有兩個if ... else語句嵌套而不是case語句。 –

回答

4

一旦您訪問了給定的行,您對列執行的操作對性能影響不大。因此,你猜測它「擊中數據庫」以服務重複使用該長度函數並不像你想象的那麼糟糕。

我會用這個比喻是一個郵遞員將郵件發送到你的房子,這是在城外的幾英里。他開車20分鐘到達您的郵箱,然後他擔心需要花費太多時間將一封信一次插入您的信箱,而不是一次寫入所有信件。與長期驅動相比,這種低效率的成本是微不足道的。

也就是說,您可以使查詢更簡潔或更易於編碼或查看。但這可能不會對性能有很大的好處。

select 
    fl.file_ID, 
    concat(fl.fileno, 
      ifnull(concat('(',fl.part_no,')'), ' '), 
      left(fl.filedesc,60), 
      if(length(fl.filedesc)>60,'...','') 
    ) as filedesc 
from filelist fl 
+0

謝謝,它的工作,我也學到了一些新的東西。 – Samcoder

+0

考慮到你的類比,郵政運營商需要郵箱所有者的身體關注嗎?我的意思是,我想,數據庫必須花費一些時間,並且每次計算長度時都要保持數據庫資源的繁忙。雖然,對於計算機來說,這並不重要! – Samcoder

+0

不要過分分析類比。 :-)我的觀點是,你可以擔心你的表現的一小部分,而不是那些佔99%以上時間的部分。這是微觀優化的習慣。 –