Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
SQL查询在某些条件下运行缓慢-MySQL_Mysql_Sql - Fatal编程技术网

SQL查询在某些条件下运行缓慢-MySQL

SQL查询在某些条件下运行缓慢-MySQL,mysql,sql,Mysql,Sql,这是我的问题,我有一个包含1230000记录的表,我正在我的应用程序中执行此查询 SELECT id_product FROM products WHERE user_id = '322' AND (status = 1 OR status = 3) AND product_date BETWEEN '2017-11-01' AND '2017-12-31' AND required = 0 这个查询从表中获得206条记录(这是正确的),但它需要4.5秒,这太

这是我的问题,我有一个包含
1230000
记录的表,我正在我的应用程序中执行此查询

SELECT id_product 
  FROM products 
 WHERE user_id = '322' 
   AND (status = 1 OR status = 3) 
   AND product_date BETWEEN '2017-11-01' AND '2017-12-31' 
   AND required = 0
这个查询从表中获得206条记录(这是正确的),但它需要4.5秒,这太多了,因为我在同一页中多次使用不同的值进行查询

但如果我只这样做

SELECT id_product FROM products WHERE user_id = '322'
需要0.322秒


WHERE语句中的每一列都有一个索引,所以这是我的问题,是否真的需要在查询中添加条件?因为在这种情况下,我看不到问题的关键,我的意思是第一个查询只找到我需要的东西,但它需要很长时间,第二个查询得到所有东西,但我可以用我正在使用的编程语言制作过滤器,或者你认为我遗漏了什么?希望您能指导我,谢谢。

您可以查看文档以使用索引提示强制查询使用或不使用索引,如下所示:

SELECT * FROM table1 USE INDEX (col1_index,col2_index)
  WHERE col1=1 AND col2=2 AND col3=3;

SELECT * FROM table1 IGNORE INDEX (col3_index)
  WHERE col1=1 AND col2=2 AND col3=3;
文件:


此外,如果确实有必要,还可以创建一个更有效的索引,其中包括WHERE的其他字段。测试这两个选项,看看哪一个更好。

请在问题中添加
explain select…
的输出。如果您将日期检查更改为使用显式
CAST(您的日期为日期)
?@juergend id=1 select\u type=SIMPLE table=products type=index\u merge可能的\u keys=idx\u status,idx\u id,idx\u date,idx_所需密钥=idx_状态,idx_id,idx_所需密钥长度=4,4,4 ref=空行=206额外=使用intersect(idx_id,idx_状态,idx_所需);使用显示的位置如果跳过
并仅选择
状态=1
,会发生什么情况。。或者像(1,3)中的状态一样
语句有时会减慢查询速度。我尝试过这样做,但它给了我错误,比如语法不正确。强制索引是不可取的。为什么不呢?你能补充一下你对@money的评论吗?不加区别地使用FORCE INDEX()也很容易适得其反。数据的分布或查询参数的值可能会发生变化,并且随着时间的推移,您认为最适合查询的键可能会成为不太受欢迎的计划。当你完全理解为什么要使用FORCE键,并且100%确信被强制使用的键不可能变坏时,就应该使用FORCE键。好吧,在某种程度上,MySQL并没有找到使用索引的最佳方法,而且你知道它正在这样做,当然将来它可能会适得其反。我明白你的意思,也正是我所想的。谢谢