2017-05-04 198 views
0

我的查询太慢了。这需要一分多钟。我如何快速创建查询? 你能帮我吗?我的查询太慢

select * from nss_sikdan_ok where od_id in(
    select od_id from nss_order od 
    join nss_cart ct on od.on_uid=ct.on_uid 
    where ct.ct_status in('cart','sell')) and (DATE_FORMAT(today_end_date,'%Y-%m-%d')='2017-05-05') and today_end='1' limit 0,1 
+0

https://tools.percona.com/query-advisor/PTBJITIG/advise粘贴查询这里得到一些整体的想法和优化技巧 – Ognj3n

回答

0

有几件事情可以做,以优化此查询。

在查询方面:

避免调用上潜在的索引列功能 - 因为它不会让MySQL使用索引该列。以下条件:

DATE_FORMAT(today_end_date,'%Y-%m-%d')='2017-05-05' 

可以被修饰以这一个,以避免使用索引列上的所述DATE_FORMAT功能,而是仅使用功能上的恒定值:

today_end_date >= DATE('2017-05-05') AND today_end_date < (DATE('2017-05-05') + INTERVAL 1 DAY) 

====

请勿在查询中使用OFFSET值 - 您可以使用faster pagination with offset in MySQL的替代方法,而不是LIMIT X,Y。

===

避免选择不使用的列 - 在大多数情况下,选择使用“*”操作符会导致性能问题,因为你获取更多的信息比实际需要的所有列。考虑在结果集中实际需要哪些列并获取它们。

===

使用数值在适当的时候 - 当数字列比较字符串,你迫使MySQL来从数转换列的值,每行一个字符串,然后才执行比较。因此,在条件today_end = '1',如果today_end数值列,所述条件应该是:

today_end = 1 

代替:

today_end = '1' 

===

此外,如果你可以提供模式结构,这将有可能为这种情况推荐适当的索引。

顺便说一句,我得到了online MySQL query optimizer的建议,所以请随时输入您的查询和架构,并获得索引建议。

0

看一看的explain output该查询,它应该给你约指标的一些见解所用或不