使用ORDER BY子句

时间:2019-05-02 19:24:45

标签: mysql sql sql-order-by query-optimization

我有一个运行良好的查询,但执行所需的时间太长,有时甚至会给出错误消息,指出由于查询所需的时间太长而导致与mysql数据库的连接丢失。这是查询:

SELECT
  EventNum,EventName,StartDate,EndDate,EventHours,
  Theme,Promoter,GenInfoPhone,GenInfoPhone2,LocationStreet1,
  LocationStreet2,LocationCity,LocationState,LocationCounty,
  Attendance,WebSite,MySpaceAddr,Twitter,Facebook,
  blog,rssfeedlink,utube,TicketEmail,TicketInfo,
  AdmissCharge,ParkingCharge,pets,NewsLink1,
  NewsTitle1,NewsLink2,NewsTitle2,NewsDate1,NewsDate2,
  Author1,AuthorEmail1,Author2,AuthorEmail2,
  adLink,Descriptionsmall,eventType,eventType2,eventType3, FairPhotos.file_name
  FROM FairListings
  LEFT OUTER JOIN FairPhotos ON FairListings.EventNum = FairPhotos.eventID
  WHERE EndDate >= '2019-05-03'
    and EndDate <= DATE_ADD( NOW( ) , INTERVAL +10 YEAR )
    and delRecord = 0
    AND ( eventType  LIKE 'cfair'
       OR eventType2 LIKE 'cfair'
       OR eventType3 LIKE 'cfair')
  ORDER BY StartDate
  LIMIT 30

请注意最后两个子句ORDER BY StartDate LIMIT 30。如果删除ORDER BY子句,它将运行完美,几乎不需要0.2秒即可执行。即使我删除了LIMIT 30,它也会返回729行,并且在没有ORDER BY的情况下也可以平稳,快速地运行。 问题是我需要ORDER BY startdate子句。我尝试将LIMIT 30放在LIMIT 30 ORDER BY StartDate之类的ORDER BY之前,但这是错误的语法。我是MySQL的菜鸟。任何人都可以解决。我想要一个查询解决方案,而不是此线程Why is my SQL Server ORDER BY slow despite the ordered column being indexed?

中eddedeed回答的多个查询

感谢所有帮助。

编辑

经过研究后,我认为 FairPhotos 表在订购时引起了问题。它有一个列,名称为upload_file ,其类型为 mediumblob 。它包含实际上传的图像文件,该文件以blob的形式存储。如果我将查询更改为此

SELECT  EventNum,EventName,StartDate,EndDate,EventHours, Theme,
        Promoter,GenInfoPhone,GenInfoPhone2,LocationStreet1, LocationStreet2,
        LocationCity,LocationState,LocationCounty, Attendance,
        WebSite,MySpaceAddr,Twitter,Facebook, blog,rssfeedlink,
        utube,TicketEmail,TicketInfo, AdmissCharge,ParkingCharge,
        pets,NewsLink1, NewsTitle1,NewsLink2,NewsTitle2,NewsDate1,
        NewsDate2, Author1,AuthorEmail1,Author2,AuthorEmail2,
        adLink,Descriptionsmall,eventType,eventType2,eventType3
    FROM  FairListings
    WHERE  EndDate >= '2019-05-03'
      and  EndDate <= DATE_ADD( NOW( ) , INTERVAL +10 YEAR )
      and  delRecord = 0
      AND  ( eventType LIKE  'cfair'
         OR  eventType2 LIKE 'cfair'
         OR  eventType3 LIKE 'cfair'
           )
    ORDER BY  StartDate

注意,我已从原始查询中删除了这些块, FairPhotos.file_nameLEFT OUTER JOIN FairPhotos ON FairListings.EventNum = FairPhotos.eventID。它仍然包含ORDER BY StartDate,但没有LIMIT 30

即使使用ORDER BY并且不使用LIMIT 30,此新查询也可以像超级按钮一样工作。它返回779行,并花费约0.02秒的时间来执行。

这是FairPhotos表的屏幕截图

enter image description here

即使我未选择update_file字段,您是否认为它也太大而无法排序?

0 个答案:

没有答案