SQL查询性能LIKE和wildecards vs. IN

时间:2012-01-30 21:30:35

标签: mysql sql performance select sql-like

如果在这两个查询中存在很大的性能差异,我只是更聪明了

SELECT 
  `items_id`, `sport_id`, `sport`, `title`, `url`, 
  `Select3`, `Select6`, `id`, `data`,`image` as image,
  concat('index.php?option=sports&item=',`items_id`,'&p=C108-M108') as count_url
FROM 
  qy9zh_dataitems
WHERE Select6 LIKE '%sport%'
ORDER BY `Select9` DESC LIMIT 0, 4


SELECT 
  `items_id`, `sport_id`, `sport`, `title`, `url`, 
  `Select3`, `Select6`, `id`, `data`,`image` as image,
  concat('index.php?option=sports&item=',`items_id`,'&p=C108-M108') as count_url
FROM 
  qy9zh_dataitems 
WHERE Select6 in ('sport') 
ORDER BY `Select9` DESC LIMIT 0, 4

查询工作得很好..他们两个......只是担心性能:)

编辑:当我做一些测试时,一件奇怪的事情是:

SELECT * FROM qy9zh_dataitems WHERE Select6 in ('kvinna') LIMIT 0, 40000
总共29,051,查询花了0.2581秒

SELECT * FROM qy9zh_dataitems WHERE Select6 LIKE ('%kvinna%') LIMIT 0, 40000
总共29,113,查询花了0.2218秒

4 个答案:

答案 0 :(得分:5)

如果在列上定义了索引,并且您正在查找此列的开头,如

name LIKE 'Jo%' 

索引可用于加速查询。但是,如果您正在寻找单词的任何部分,如

name LIKE '%man%' 

无法使用索引。

IN子句通常非常快,但我不知道它是否可以利用索引。

查询的速度取决于适当索引的可用性,表的大小,值的分布(许多行具有相同的值,每行具有不同的值),当然还取决于查询本身。我认为你的问题不能得到普遍回答。进行测试并进行比较!

答案 1 :(得分:3)

这些甚至不是相同的查询,因此无法比较性能。

第二个查询可以使用Select6上的索引将行限制为等于sport的行,而第一个查询必须查看每一行以查看它是否包含sport Select6内容中的任何位置。你想比较苹果和橘子。

答案 2 :(得分:2)

这些是非常不同的标准。

WHERE Select6 LIKE '%sport%'

将查找select6包含单词sport的情况。

WHERE Select6 in ('sport') 

将查找select6是单词sport的情况。

IN条件允许您指定可能值的列表,如果您已为该字段编制索引,则应该非常快。类似的,特别是在字符串中的任何地方寻找单词的类似可能很难索引。 Where select6 like 'sport%'会查找select6以单词sport开头的情况,并且可以编制索引。

答案 3 :(得分:1)

正如其他人发布的那样,基本索引不能用于使用领先通配符的搜索。如果您认为这些查询最常见,那么您需要查看MySQL中的全文搜索功能。

全文搜索提供了一种基于文本中单个单词查找记录的有效方法。但即便如此,也会有局限性(例如,搜索“port”这个词并不一定会返回像“sport”这样的记录。)

MySQL Full Text Search