mysql通过id在之间选择

mysql通过id在之间选择,mysql,Mysql,我有一个关于连接两个表的问题 TWD\U CSD\U新闻详细信息(2亿行): SHOW CREATE TABLE TWD\u CSD\u NEWS\u DETAIL的结果: CREATE TABLE `TWD_CSD_NEWS_DETAIL` ( `CSD_ID` int(11) NOT NULL AUTO_INCREMENT, `CSD_ID_CREATED_BY` int(11) DEFAULT NULL, `CSD_DT_CREATED` datetime DEFAULT NU

我有一个关于连接两个表的问题

TWD\U CSD\U新闻详细信息(2亿行):

SHOW CREATE TABLE TWD\u CSD\u NEWS\u DETAIL的结果

CREATE TABLE `TWD_CSD_NEWS_DETAIL` (
  `CSD_ID` int(11) NOT NULL AUTO_INCREMENT,
  `CSD_ID_CREATED_BY` int(11) DEFAULT NULL,
  `CSD_DT_CREATED` datetime DEFAULT NULL,
  `CSD_DT_UPD` datetime DEFAULT NULL,
  `CSD_ID_DRI` int(11) DEFAULT NULL,
  `CSD_ID_UPD_BY` int(11) DEFAULT NULL,
  `CSD_PARTY_ID` int(11) DEFAULT NULL,
  `CSD_AMOUNT` decimal(26,0) DEFAULT NULL,
  `CSD_TIMESTAMP` datetime DEFAULT NULL,
  PRIMARY KEY (`CSD_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=184035984 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
TWD_DRI_新闻_结果_标题(100万行):

显示创建表格TWD\U DRI\U新闻\U结果\U标题的结果:

CREATE TABLE `TWD_DRI_NEWS_RESULT_HEADER` (
  `DRI_ID` int(11) NOT NULL AUTO_INCREMENT,
  `DRI_DATE` datetime DEFAULT NULL,
  `DRI_SYM_SYMBOL` int(11) DEFAULT NULL,
  `DRI_TIMESTAMP` datetime DEFAULT NULL,
  PRIMARY KEY (`DRI_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1592193 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

我试着用下面的sql将它们连接起来,它可以工作,但是当我继续在
where
cluase中添加csd\u id范围时,完成这个查询需要很长时间

SELECT 
    csd.CSD_ID, csd.CSD_ID_DRI, csd.CSD_PARTY_ID, csd.CSD_AMOUNT ,  dri.DRI_DATE, dri.DRI_SYM_TICKER
FROM
    TWD_CSD_NEWS_DETAIL csd
        LEFT JOIN
    TWD_DRI_NEWS_RESULT_HEADER dri ON dri.DRI_ID = csd.CSD_ID_DRI
WHERE
   (  
     ( 
    ( csd_id between 1 and 426029) 
 || ( csd_id between 426030 and 851977) 
 || ( csd_id between 851978 and 1277890) 
   ..
...
...
     ) 
AND dri.DRI_SYM_SYMBOL = 1 

   )

我是否需要创建另一个视图来包含结果,或者创建任何更快的方法来查询结果?我尝试将范围
设置为1到200000000之间
其他持续时间和提取时间需要0.197秒/26秒

您尝试过使用单个范围进行查询吗

 SELECT 
  csd.CSD_ID, csd.CSD_ID_DRI, csd.CSD_PARTY_ID, csd.CSD_SHAREHOLDING ,  
  dri.DRI_SHAREHOLDING_DATE, dri.DRI_SYM_TICKER
 FROM
  TWD_CSD_NEWS_DETAIL csd
 LEFT JOIN
  TWD_DRI_NEWS_RESULT_HEADER dri ON dri.DRI_ID = csd.CSD_ID_DRI
 WHERE
  csd_id between (1 and 1277890) AND dri.DRI_SYM_SYMBOL = 1;

您的
WHERE
子句看起来像一个大范围。您为什么不在1和1277890之间执行csd_id的任何原因?“我尝试使用以下sql连接它们,它可以工作,但需要很长时间才能完成此查询”是否有索引?显示问题中涉及的所有表格的
Show CREATE TABLE TABLE
输出。。另外,请给出EXPLAIN query的输出,获取时间为0.197,获取时间为26秒。当我添加限制1500,thx和多个范围或单个范围时,工作速度要快得多,对结果影响不大。
SELECT 
    csd.CSD_ID, csd.CSD_ID_DRI, csd.CSD_PARTY_ID, csd.CSD_AMOUNT ,  dri.DRI_DATE, dri.DRI_SYM_TICKER
FROM
    TWD_CSD_NEWS_DETAIL csd
        LEFT JOIN
    TWD_DRI_NEWS_RESULT_HEADER dri ON dri.DRI_ID = csd.CSD_ID_DRI
WHERE
   (  
     ( 
    ( csd_id between 1 and 426029) 
 || ( csd_id between 426030 and 851977) 
 || ( csd_id between 851978 and 1277890) 
   ..
...
...
     ) 
AND dri.DRI_SYM_SYMBOL = 1 

   )
 SELECT 
  csd.CSD_ID, csd.CSD_ID_DRI, csd.CSD_PARTY_ID, csd.CSD_SHAREHOLDING ,  
  dri.DRI_SHAREHOLDING_DATE, dri.DRI_SYM_TICKER
 FROM
  TWD_CSD_NEWS_DETAIL csd
 LEFT JOIN
  TWD_DRI_NEWS_RESULT_HEADER dri ON dri.DRI_ID = csd.CSD_ID_DRI
 WHERE
  csd_id between (1 and 1277890) AND dri.DRI_SYM_SYMBOL = 1;