Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
OR子句大大降低了MYSQL查询的速度_Mysql_Mysql Workbench - Fatal编程技术网

OR子句大大降低了MYSQL查询的速度

OR子句大大降低了MYSQL查询的速度,mysql,mysql-workbench,Mysql,Mysql Workbench,我有一个查询由于以下3个或3个子句而减慢了速度: select * from book join library_member USING(book_id) where member_id = 1145 and ( Date_add(Current_date(), interval 1 month) BETWEEN book.check_in AND book.check_out ) OR ( Current_date() BETWEEN

我有一个查询由于以下3个或3个子句而减慢了速度:

select * from book join library_member USING(book_id)
where member_id = 1145
and
( Date_add(Current_date(), interval 1 month) BETWEEN 
                 book.check_in AND book.check_out ) 
          OR ( Current_date() BETWEEN book.check_in AND 
             book.check_out ) 
          OR ( book.check_out BETWEEN Current_date() AND Date_add( 
                                              Current_date(), 
                                              interval 1 month) 
             ) 
          OR ( book.check_in BETWEEN 
               Current_date() AND Date_add(Current_date(), interval 1 month) )

有没有更好的方法查询这4种情况中的任何一种?

是的-有更快的方法查找日期重叠!我最近有一个这样的需求,我很高兴找到了一个解决堆栈溢出的方法,它不使用或

我在我的代码中对此进行了测试,它工作完美,执行速度非常快

您可以检查日期重叠情况,如下所示:

AND DATEDIFF(LEAST(Date_add(Current_date(), interval 1 month), book.check_out),GREATEST(Current_date(), book.check_in)) > 0;

考虑以下几点:

SELECT c.olumns
     , y.ou
     , a.ctually
     , n.eed
  FROM book b
  JOIN library_member m
    ON m.book_id = b.book_id
 WHERE m.member_id = 1145
   AND DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH) > b.check_in
   AND CURRENT_DATE() < b.check_out
选择c列
,你
实际上
,n.eed
b书
加入图书馆成员
关于m.book\u id=b.book\u id
其中m.member_id=1145
和日期添加(当前日期(),间隔1个月)>b.签入
和当前日期()

(b.check_in,b.check_out)和(m.book_id)上的索引将很有用

请在每一列前面加上它所属的表名或别名。我们不清楚哪些表有哪些列,很难相信。1145会员借了多少本书?你确定你有正确的条件吗?一本书怎么可能在未来一个月内结帐或签到?什么是表格定义?你有什么索引?EXPLAIN对执行计划说了什么?函数不使用索引是正确的。然而,根据大量的经验,这个解决方案工作得更快,因为它是一个WHERE子句,而不是4。您确实需要基于其他字段添加其他子句。在问题中的查询中,应该在成员_idtwo上有一个索引,其中没有OR的条件会更快。你说得对。但是,您对这个问题的回答不起作用,因为它缺少一个场景。这就是为什么我喜欢用一个条款来解决重叠日期的问题。与ORs相比,它的工作效率更高,并且给出了相同的结果。重叠测试是在事件A在事件B结束之前开始,然后在事件B开始之后结束。没有别的测试了。我看得出你坚持认为自己是正确的。以下是您正在使用的场景。我不欣赏否决票。日期2020年1月1日2020年6月2日2019年1月2日2021年6月您的解决方案无法处理此场景,因为这将返回false:并且2021年6月>2020年1月和2019年1月<2020年6月我没有任何要修复的内容。上面提供的解决方案完美无瑕。我最近为自己的项目进行了测试。我有多年使用OR解决方案的经验,以及它如何减慢MySQL查询的速度。请尝试修正您的答案,以包括我给您的场景,您将看到我的意思…这将给出与我最初的查询不同的结果:(这只能是重新排列
小于s
大于s
-或可能使用排除联接的情况。请参阅:此解决方案不起作用。此处为缺少此解决方案的场景。日期为2020年1月1日至2020年6月2日至2019年1月2日至2021年6月2日,它不处理此场景,因为这将返回false:且2021年6月>2020年1日2019年1月<2020年6月