1

有什么区别(索引选择?速度?):

select * from table where x = 'a' or x = 'b'

对比

select * from table where find_in_set(x, 'a,b')

我应该使用其中之一还是它们相等?

4

3 回答 3

1

FIND_IN_SET是一个应该完全跳过索引的函数调用。

你应该考虑使用

SELECT * FROM `table` WHERE x IN ('a', 'b')

反而。

于 2014-06-10T08:46:42.230 回答
1

你应该尽可能避免 FIND_IN_SET !在大多数情况下,当列未标准化时使用它(例如单元格中的 csv)。IN 非常快,因为它能够使用索引(如果存在索引)。一个疯狂的例子是使用 FIND_IN_SET(primary_index_column, "1,2,3") 使用主键作为第一个参数。使用 primary_index_column IN (1,2,3) MySQL 使用主键作为索引,速度快如闪电 - 而字符串函数非常慢。有时差异是 1000 倍。

例如这个查询

SELECT DISTINCT 
a1.usi as usishow,
m1.m1g1
FROM a1 LEFT JOIN p1 ON (a1.usi = p1.id)

left join m1 on (m1.m1id = p1.emxid) WHERE a1.umi=99999 AND p1.adi = 0 AND p1.id IN (13700325,13700273,13692054,13691440,13692237,13691503,13691512,13691621,13691632,13691653,13691659,13691682,13691702,13691705,13691720,13691723,13691728,13691763,13691782,13691786,13691815,13691818,13691826,13691828,13691830,13691906,13691831,13691843,13691846,13691848,13691849,13691860,13691873,13691881,13691893,13691945,13691939,13691942,13691977,13692043,13691995,13691996,13692004,13692006,13692011,13692012,13692033,13692090,13692042,13692055,13692062,13692225,13692072,13692089,13692111,13692122,13692142,13692156,13692167,13692170,13692173,13692176,13692178,13692183,13692187,13692193,13692202,13692208,13692217,13692216,13692236,13692238,13692239,13692260,13692274,13692275,13692276,13692280,13692285,13692289,13692291,13692293,13692299,13692305,13692313,13692338,13692348,13692355,13692356,13692365,13692370,13692372,13692376,13692696,13692707,13692701,13692708,13692715,13692727,13692734,13692733,13692735,13692758,13692761,13692762,13692781,13692851,13692854,13694572,13697874,13697878,13697885,13697891,13697897,13697898,13697903,13697904,13697912,13697914,13699899,13697949,13697971,13697976,13698138,13698775,13699851,13699854,13699858,13699859,13699880,13699905,13699908,13699909,13699918,13699932,13699936,13699950,13699959,13699971,13700298,13700162,13700163,13700174,13700177,13700195,13700201,13700238,13700248,13700267,13700276,13700303,13700393,13700399,13700410) ORDER BY usishow

(包含三个表 a1、m1 和 p1。p1.id 是 p1 的主索引。)想象 FIND_IN_SET(p1.id, 13700325,13700273,...) > 0 不使用索引,执行时间为 14 秒(!)。相对

p1.id IN (13700325,13700273,...)

使用 p1 的主索引,执行时间为 0.02 秒(!)。

因此, 使用 包含单个值的列进行测试和EXPLAIN (EXPLAIN SELECT ....) 所有查询 !FIND_IN_SET与之相比,值得付出努力IN (...)- 在大多数情况下,您可以节省大量时间、内存(可能是磁盘读取)和 CPU 功率!

于 2016-10-18T18:39:02.800 回答
-1

据我了解,

select * from table where find_in_set(x, 'a,b')

工作速度会更快,因为它会根据值列表搜索一个值,并在找到匹配项后立即跳过搜索。但OR适用于列中的所有值。

如果我错了,请纠正我。

于 2013-09-16T10:09:34.687 回答