我想搜索一个表来查找一个特定字段是两个值之一的所有行。我确切知道这些值是什么,但我想知道哪种搜索方式最有效:
为了举例,两个值是“xpoints”和“ypoints”。我确信在该字段中没有其他值在末尾有“点”,所以我正在考虑的两个查询是:
WHERE `myField` IN ('xpoints', 'ypoints')
--- or...
WHERE `myField` LIKE '_points'
在这种情况下会得到最好的结果吗?
答案 0 :(得分:14)
与SQL查询一样,通过分析器运行它以查找。然而,我的直觉本能不得不说IN搜索会更快。特别是在您给出的示例中,如果字段已编入索引,则只需执行2次查找。如果您进行了类似搜索,则可能需要进行扫描,因为您正在查找以特定值结尾的记录。它也会更准确,因为LIKE'_ points'也可以返回'gpoints'或任何其他类似的字符串。
答案 1 :(得分:1)
除非相关列中的所有数据项都以“x”或“y”开头,否则我相信IN总能为您提供更好的查询。如果它被编入索引,正如@Kibbee指出的那样,你只需执行2次查找即可获得两者。或者,如果没有编入索引,使用IN的表扫描只需要在大多数时间检查第一个字母,而使用LIKE则每次都必须检查两个字符(假设所有项目至少为2个字符) - 因为第一个角色可以是任何东西。
答案 2 :(得分:0)
试一试,看看。创建大量的测试数据,并在myfield上使用和不使用索引进行尝试。当你在这里时,看看它们之间是否有明显的区别 比如' points'和LIKE'xpoint '。
这取决于优化器对每个查询的作用。
对于少量数据,差异可以忽略不计。做任何一个更有意义的事情。对于大量数据,磁盘I / O的数量远远超过CPU时间。
如果myfield上有索引,我打赌IN会比LIKE获得更好的结果。我还打赌'xpoint_'的运行速度比'_points'快。但没有什么能比得上自己尝试一样了。
答案 3 :(得分:0)
MySQL在使用字符串比较时不能使用索引,例如LIKE'%foo'或'_foo',但可以使用索引进行比较,例如'foo%'和'foo _'。
因此,在您的情况下,假设字段已编入索引,IN将更快。
如果您正在使用一组有限的可能值,那么值得将该字段指定为ENUM - 然后MySQL将其内部存储为整数,并使这种查找更快,并节省磁盘空间。
答案 4 :(得分:0)
IN-version比LIKE版更快。特别是当您的通配符不在比较结束时,但即使在理想条件下,IN仍然是理想的,直到您的查询接近最大查询插入的大小。