MySQL是LIKE昂贵的SELECT?

时间:2009-12-08 09:19:53

标签: mysql

以下问题是关于选择完全匹配(例如:INT)与与varchar“LIKE”匹配之间的速度。

有很大区别吗?我问这个问题的主要原因是因为我试图决定是否将ID留在我当前的项目之外。

例如,而不是:

http://mysite.com/article/391239/this-is-an-entry

更改为:

http://mysite.com/article/this-is-an-entry

从长远来看,您认为我会遇到任何性能问题吗?我应该保留身份证吗?

注意:

我会使用LIKE让用户更容易记住。例如,如果他们写“http://mysite.com/article/this-is-an”,它会重定向到正确的。

关于页数,让我说我大概是79,230和应用程序。正在快速增长。比如我们每天说1640个条目

7 个答案:

答案 0 :(得分:5)

INT比较将比字符串(varchar)比较快。 LIKE比较甚至更慢,因为它涉及至少一个通配符。

这对您的申请是否重要,很难说清楚您告诉我们的内容。除非它真的很密集,即。你正在进行这些比较,我会清楚地告诉你的用户。

需要考虑的另一件事是:用户是否总是要输入网址?或者他们只是想使用搜索引擎?这些天我只是搜索,而不是尝试记住一个URL。这将使我成为一个非问题的用户。你有什么用户喜欢的?您能从您的应用程序中了解他们如何访问您的网站吗?

答案 1 :(得分:3)

首先,我认为这两种方式并不重要,是的,因为LIKE子句涉及的工作多于直接比较,所以速度会慢一些,但正常站点的速度可以忽略不计。

如果您要衡量执行查询所需的时间,可以轻松测试这一点,plenty of examples可以帮助您完成此部门。

为了远离你的问题,你必须问问自己是否甚至需要使用LIKE来进行此查询,因为'this-is-an-entry'应该是唯一的,对吧?

SELECT id, friendly_url, name, content FROM articles WHERE friendly_url = 'this-is-an-article';

答案 2 :(得分:3)

“SELECT * FROM x WHERE = 391239”查询将比“SELECT * FROM x WHERE ='some-key'”快,这反过来会比“SELECT * FROM x WHERE LIKE”更快%some-key%'“(外卡的存在不会产生很大的差异。

快多少? 快两倍? - 非常可能。 快十倍?伸展它但可能。这里真正的问题是1)它是否重要2)你是否应该首先使用LIKE。

1)是否重要 我可能会说不。如果您确实拥有391,239 +个独特的文章/页面 - 并且假设您获得了相当级别的流量,那么这可能只是您可能遇到的许多扩展问题之一。但是,我保证情况并非如此,因此在你达到100万和1之前,你不应该担心百万次页面浏览。

2)你是否应该使用LIKE 不可以。如果页面/文章标题/名称是URL“slug”的一部分,则它必须是唯一的。如果不是,那么你就是在搜索引擎优化方面为自己拍摄自己并为自己写一个维护噩梦。如果标题/名称是唯一的,那么您可以使用“WHERE title ='some-page'”,并确保标题列具有唯一索引。

修改

你计划使用LIKE作为URL是完全疯狂的。如果有人访问

会发生什么
yoursite.com/articles/the

您是否返回了以“the”开头的所有页面的列表?如果出现以下情况:

作者A创建

yoursite.com/articles/stackoverflow-is-massive

2天后作者B创建了

yoursite.com/articles/stackoverflow-is-massively-flawed

A不仅会因为他的文章遭到嘲笑而感到非常生气,他可能已被发送的所有永久链接都将被破坏,Google将永远不会给你的文章任何合理的页面排名,因为内容不断变化,有效地稀释自己。

有时你有一个很好的理由,你以前从未在其他任何地方见过你惊人的新“想法/功能/发明/节省时间”。

答案 3 :(得分:1)

INT速度要快得多。

在字符串案例中,我认为您不应该使用LIKE选择查询,而应选择=,因为您查找的是this-is-an-entry,而不是this-is-an-entry-and-something

答案 4 :(得分:1)

有几件事需要考虑:

在数据库上执行的搜索类型将是“索引搜索”,在大多数情况下使用索引搜索单行。

使用整数而不是字符串,单行上的这种类型的精确匹配操作并不会明显快,对于任何实际目的而言,它们的成本基本相同。

您可以做的是以下优化,使用完全匹配(无通配符)搜索数据库,这与使用int索引一样快。如果没有匹配进行模糊搜索(使用通配符搜索),这种情况更为昂贵,但另一方面更为罕见并且可以产生多个结果。如果您想要获得最佳匹配,则需要一种排名结果。

伪代码:

  • 使用字符串搜索完全匹配:文章类似'entry'
  • if(找到匹配)显示页面
  • if(找不到匹配项)使用通配符搜索
    • 如果(找到一个匹配的匹配项)显示页面
    • 如果(更相关的匹配项)显示“您是否试图找到...页面”
    • 如果(不匹配)显示错误页面

注意:请注意,从SEO的角度来看,不建议使用模糊网址,因为人们可以使用多个网址关联您的网站,这会分割您的网页排名而不是增加网页排名。

答案 5 :(得分:0)

如果你在varchar字段上放一个索引它应该没问题(性能明智),实际上取决于你将拥有多少页面。此外,您必须更加小心并清理字符串以阻止sql注入,例如只允许查询中的a-z,0-9, - ,_等。

我仍然更喜欢整数id,因为它更快更安全,将格式更改为更好的类似: http://mysite.com/article/21-this-is-an-entry.html

答案 6 :(得分:0)

如上所述,比较INT< VARCHAR,如果表在您正在搜索的字段上编入索引,那么这也会有帮助,因为服务器不必动态创建手动索引。

有助于验证查询速度和感知的一件事是EXPLAIN。您可以使用它来显示查询使用的索引以及执行时间。

要回答您的问题,如果可以使用文章ID(即INT)上的完全匹配来构建您的系统,那么它将比您尝试使用LIKE匹配整个URL更“轻”声明。 LIKE显然会有效,但我不想在它上面运行一个大型的高流量网站。