如何调整以下MySQL查询?

时间:2011-11-05 16:04:31

标签: 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

我不想重复使用长度函数,因为我猜它会在每次声称性能问题时都会遇到数据库。请建议我是否可以存储一次长度并多次使用。

1 个答案:

答案 0 :(得分: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