2009-12-08 61 views
4

以下问题是关于选择完全匹配(例如:INT)与使用varchar的“LIKE”匹配之间的速度。MySQL是像SELECT一样昂贵的吗?

有很大的区别吗?我问这个问题的主要原因是因为我试图决定是否将ID从我当前的项目中删除。

例如相反的:

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

更改为:

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

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

注:

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

关于页数,可以说我是在79,230左右的应用程序。正在快速增长。喜欢可以说每天1640条目

回答

5

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

在您的应用程序中这是否显着是很难从您告诉我们的。除非它非常密集,即。你正在做这些比较的gazillions,我会清楚地为你的用户。

另一件需要考虑的事情是:用户是否总是要输入URL?或者他们只是要使用搜索引擎?现在我只是搜索,而不是尝试和记住一个URL。这会使我成为一名用户不成问题。你的用户喜欢什么?你能告诉你的应用程序他们如何访问你的网站?

+0

但速度有多快?这就是问题所在。 – MarioRicalde 2009-12-08 09:24:01

+0

非常快...... :)如果你想更准确 - 它取决于机器等。 – hsz 2009-12-08 09:26:43

+1

主要问题是,应用程序实际上增长速度超过预期。所以有一次它可以让我们说1,000,000个条目,并且仍然越来越多。也许我应该保持整数? – MarioRicalde 2009-12-08 09:28:30

3

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

如果您要测量执行查询所用的时间,则可以轻松测试此功能,但有plenty of examples可帮助您完成此部门。

若要从您的问题中解决问题,您必须问自己,您是否需要使用LIKE进行此查询,因为“这是一个条目”应该是唯一的,对吗?

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

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

+0

那你怎么样在数据库中:“这是一篇文章”和“这是一个不需要的页面”? – hsz 2009-12-08 09:28:52

+2

我非常怀疑用户会从内存中输入一个网址,大多数都是通过Google或用户书签获取的。 – 2009-12-08 09:29:00

1

INT更快。

在字符串的情况下,我认为是因为你找this-is-an-entry,不是this-is-an-entry-and-something你不应该LIKE但只是=选择查询。

0

如果你把一个索引放在varchar字段上,它应该没问题(性能明智),这取决于你将拥有多少页面。另外,您必须更仔细并将字符串消毒至,防止sql注入,例如在您的查询中只允许a-z,0-9, - ,_等。

我还是喜欢一个整数ID,因为它是更快,更安全,格式更改为更好,如: http://mysite.com/article/21-this-is-an-entry.html

0

至于说,比较INT < VARCHAR,如果表是索引的字段,你'然后搜索也会有帮助,因为服务器不需要动态创建手动索引。

有一件事将有助于验证您的查询速度和意义是EXPLAIN。您可以使用它来显示您的查询正在使用哪些索引,以及执行时间。

要回答你的问题,如果可以使用文章ID(即INT)上的精确匹配来构建系统,那么它将比如果您尝试使用LIKE声明。 LIKE显然会工作,但我不想在其上运行一个大型的高流量站点。

3

“SELECT * FROM x WHERE = 391239”查询将比“SELECT * FROM x WHERE ='some-key'”更快,这反过来会比“SELECT * FROM x WHERE LIKE “%某些键%””(野生卡的存在不会使不同的堆

有多快两倍快 - ?很可能十倍快?但是可能的话,这里真正的问题是1)它是否重要,2)你是否应该首先使用LIKE。

1)有关系吗 我可能会说不。如果您确实拥有391,239多篇独特的文章/页面 - 并且假设您获得了可比的流量级别,那么这可能只是您可能遇到的许多缩放问题之一。不过,我保证情况并非如此,因此,除非您获得100万和1个网页浏览量,否则您不必担心一百万个网页浏览量。

2)如果您甚至可以使用像这样 号如果页面/文章的标题/名称的网址是“鼻涕虫”的一部分,它必须是唯一的。如果不是的话,那么你就是在搜索引擎优化方面投入自己的脚步,并为自己写一篇维护梦魇。如果标题/名称是唯一的,那么您可以使用“WHERE title ='some-page'”,并确保标题列上具有唯一索引。

编辑使用喜欢的网址的

你的计划是完全彻底的疯狂。如果有人访问,会发生什么事

yoursite.com/articles/the 

您是否返回开始“the”的所有页面的列表?接下来会发生什么,如果:

作者A创建

yoursite.com/articles/stackoverflow-is-massive 

两天后作者B创建

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

不仅会是相当愤怒,他的文章已经HI-抬高,所有的他可能已经发送出去的perma-links将会被打破,而且Google将永远不会给你的文章任何合理的页面排名,因为内容不断变化并且有效地削弱了自己。

有时候,有一个很好的理由,你从未在别的地方见过你的惊人新“想法/特征/发明/节省时间”。

+0

伟大的关于文章“hi-jacking”的可能性。在我参与的一个项目中,我遇到过类似的情况,这是一个噩梦。 – 2012-02-23 14:43:37

1

有一些事情要考虑:

对数据库进行搜索的类型将是一个“索引查找”,使用索引,大部分时间寻找单列。

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

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

伪代码:

  • 搜索使用字符串的精确匹配:文章就像“进入”
  • 如果(找到匹配)显示页面
  • 如果(没有找到匹配),使用搜索通配符
    • 如果(一个apropriate找到匹配)显示页面
    • 如果(更多相关的匹配)显示“你试图找到...页”
    • 如果(没有匹配)显示错误页面

注:记住,模糊的网址不是从SEO的角度来看建议,因为人们可以使用多个URL,将分离链接你的网站您的网页排名,而不是增加它。