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并没有找到使用索引的最佳方法,而且你知道它正在这样做,当然将来它可能会适得其反。我明白你的意思,也正是我所想的。谢谢