0

我尝试加入两个表:

SELECT E . * , D . * 
FROM  `basicincident` E
LEFT JOIN incident D ON E.`INC_KEY` = D.`INC_KEY` 
WHERE E.`STATE` =  "MD"
AND SUBSTRING( E.INC_DATE , -4 ) =  "2009"
LIMIT 0 , 10

它产生了良好的结果。

但是使用时order by,需要更长的时间才能产生结果。

SELECT  E . * , D . *
FROM  `basicincident` E 
LEFT JOIN incident D ON E.`INC_KEY` = D.`INC_KEY` 
WHERE E.`STATE` =  'MD' 
  AND SUBSTRING( E.INC_DATE , -4 ) = '2009' 
  AND E.INC_KEY >"MD0100110520090000015011111" 
ORDER BY E.INC_KEY limit 0,2
4

2 回答 2

0

E.INC_KEY 和 D.INC_KEY 的索引出于各种原因(包括这个)都很好。

您可以尝试按 d.INC_KEY 进行排序,以防优化器中发生有趣的事情。

关于上面的回答,请无视!

1) 你不能忽略 ORDER BY with LIMIT。如果您这样做,它将选择哪些行?只是查询计划中出现的任何内容 - 很可能不是您想要的。如果您需要 ORDER BY,那么您需要它。性能问题绝不能妨碍交付实际正确的结果!

2)数据库被设计为排序。认为你可以做得更好是愚蠢的——你做不到。为正确的工作使用正确的工具。

于 2013-04-10T04:30:55.027 回答
0

您是否使用您需要在期间周围留出空格?

SELECT E . * , D . *

您需要给出命令,所以这样编写 SQL:

SELECT  E.*, D.* FROM `basicincident` E
    LEFT JOIN incident D ON E.`INC_KEY` = D.`INC_KEY`
    WHERE E.`STATE` = 'MD'
        AND SUBSTRING( E.INC_DATE , -4 ) = '2009'
        AND E.INC_KEY > "MD0100110520090000015011111"
    ORDER BY `E`.`INC_KEY` ASC
    LIMIT 0,2
于 2013-04-10T04:20:09.443 回答