如果在这两个查询中存在很大的性能差异,我只是更聪明了
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秒
答案 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”这样的记录。)