Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么在索引字段上选择时使用IN(…)会降低SELECT查询的性能?_Mysql - Fatal编程技术网

Mysql 为什么在索引字段上选择时使用IN(…)会降低SELECT查询的性能?

Mysql 为什么在索引字段上选择时使用IN(…)会降低SELECT查询的性能?,mysql,Mysql,避免在(…)中使用在索引字段上进行选择时,这将破坏SELECT查询的性能 我在这里找到了这个: 你能解释一下吗?为什么这会扼杀性能?我应该用什么来代替。“或”可能的陈述?我相信,被视为一组口服补液盐,所以使用口服补液盐是没有帮助的 另一种方法是创建一个临时表来保存IN子句的值,然后在SELECT中与该临时表联接 例如: CREATE TEMPORARY TABLE temp_table (v VARCHAR) INSERT INTO temp_table VALUES ('foo') INS

避免在(…)中使用在索引字段上进行选择时,这将破坏SELECT查询的性能

我在这里找到了这个:


你能解释一下吗?为什么这会扼杀性能?我应该用什么来代替。“或”可能的陈述?

我相信,被视为一组口服补液盐,所以使用口服补液盐是没有帮助的

另一种方法是创建一个临时表来保存IN子句的值,然后在SELECT中与该临时表联接

例如:

CREATE TEMPORARY TABLE temp_table (v VARCHAR)

INSERT INTO temp_table  VALUES ('foo')
INSERT INTO temp_table  VALUES ('bar')

SELECT * FROM temp_table tmp, orig_table orig
WHERE temp_table.v = orig.value

DROP TEMPORARY TABLE temp_table

因为MySQL不能优化它

以下是一个例子:

explain select * from keywordmaster where id in (1, 567899);
(很抱歉外部链接。此处显示不正确)

下面是另一个问题:

   explain 
   select * from table where id = 1
   union
   select * from keywordmaster where id = 567899


正如您在第二个查询中所看到的,我们得到
ref
作为
const
type
是const而不是range。MySQL无法优化范围扫描。

说实话,这句话与我在MySQL书籍和文章中读到的许多提示相矛盾

以下是一个例子:

此外,它本身还具有处理大值列表的额外增强功能,因为它被认为是某些
范围
查询的有用替代:

如果所有值都是常量,则将根据expr的类型对其进行求值并进行排序。然后使用二进制搜索完成对项目的搜索。这意味着,如果IN值列表完全由常量组成,则IN非常快

仍然过度使用INs可能会导致查询速度变慢。有些情况在中有所说明。

mySQL似乎只会对一个表使用一个索引。因此,如果您有一个
SELECT*FROM tbl,其中(a=6或b=33)
它可以选择使用a索引或b索引,但不能同时使用两者。请注意,它表示字段,复数形式。我怀疑这个建议是从那个时候开始的,而解决的办法是结合结果,比如:

SELECT * FROM tbl WHERE (a = 6)
UNION
SELECT * FROM tbl WHERE (b = 33)

然而,第二个查询似乎至少在我的数据集上花费了更长的时间。@newtover这只适用于“在索引字段上选择时”,我也查看了它,它表示:“EXPLAIN的输出有时会让人很难判断MySQL是否真的在寻找一系列值,或者一系列值。。。我们不仅仅是挑剔:这两种索引访问的性能不同。范围条件使MySQL忽略索引中的任何其他列,但多重相等条件没有该限制。”