什么更快:MySQL LEFT(*,100)还是PHP substr()?

时间:2011-08-30 18:47:45

标签: php mysql

我正在构建数据库中最近10个更新页面的简单列表。我需要显示的每条记录:名称和缩写/截断的描述,存储为TEXT。有些页面的描述可能超过10,000个字符。

哪种速度和性能更好?或者更好的方法来解决这个问题?我同时使用Zend和Smarty。

的MySQL

SELECT id, name, LEFT(description, 100) FROM pages ORDER BY page_modified DESC LIMIT 10;

PHP

function ShortenText($text) {
// Change to the number of characters you want to display        
$chars = 100;        
$text = $text." "; 
$text = substr($text,0,$chars);
$text = substr($text,0,strrpos($text,' '));
$text = $text."...";        
return $text; 
}

5 个答案:

答案 0 :(得分:15)

因为你的问题特别“快”而不是“更好”,我可以肯定地说,在DB中执行计算实际上更快。 “更好”是一个非常不同的问题,根据用例,@ Graydot的建议在某些情况下可能会更好。

让应用程序服务器在不需要时编组数据的概念与专门化的想法不一致。数据库专门用于检索数据和对数据执行大量计算;这就是他们最擅长的。应用程序服务器旨在协调持久性,业务逻辑和用户界面之间的流程。

您是在SQL语句中使用sum()还是将所有值检索到应用服务器中,然后循环并添加它们?绝对,在DB中执行总和更快......请记住,应用程序服务器实际上是数据库的客户端。如果您将所有数据撤回到应用程序服务器进行运算,那么您将通过网络(甚至只是跨越RAM段)发送不需要移动的数据字节...并且所有数据都通过数据库驱动程序流动有许多小代码内容触及并移动数据。

但是还有“更好”的问题,这是特定于问题的...如果您有需要行级数据,或客户端过滤和重新求和的要求(或让用户指定他们有多少左角色调)想要在结果集中看到,那么在app服务器中执行它可能是有意义的,所以你不必继续回到数据库。

你特意问“更快”,答案是“数据库” - 但“整体更快”可能意味着别的东西,“整体更好”完全是别的东西。像往常一样,真相是模糊的,几乎所有事情的答案都是“它取决于”

HTH 乔恩

答案 1 :(得分:5)

数据库中的LEFT。

  • 发送回客户端的数据较少(在这种情况下少得多,最多1k对100k文本)
  • 与实际的表格访问,ORDER BY等相比,它是微不足道的

它也不会违反任何规则,例如“客户端格式化”:这只是常识

编辑:看起来我们正在酝酿宗教战争。

如果问题要求复杂的字符串操作或格式化或非聚合计算,那么我会说使用php。这不是这些情况。

无法优化的一件事是与db +客户端代码相比的网络。

答案 2 :(得分:3)

我同意gbn的观点,但如果您想要整合...后缀,可以尝试:

SELECT   id,
         name,
         CASE WHEN LENGTH(description)>25 THEN
           CONCAT(LEFT(description, 25),'...')
         ELSE
           description
         END CASE AS short_description
FROM     pages
ORDER BY page_modified DESC
LIMIT    10;

其中25是预览文本应具有的字符数。 (注意这不会分成整个单词,但你的PHP函数也没有。)

答案 3 :(得分:2)

我的POV(这可能是错的!)是PHP用于解析服务器中的东西,将其发送到数据库,然后将其呈现给客户端。我更喜欢在数据库中使用存储过程 - 因为很容易知道要执行哪些查询并确保遵守业务逻辑。

我只是认为拥有这些明确的界限是个好主意。

忘记提及 - 数据库比PHP脚本更了解数据的结构和性质。

答案 4 :(得分:0)

一般经验法则:

  • 将子字符串函数保留在 WHERE 子句之外,因为必须比较 WHERE 子句中的多个列的标量性质。

  • 在列上使用子字符串函数,因为数据库服务器和数据库客户端之间存在明显的瓶颈。