簡體   English   中英

簡化自我聯接SQL

[英]Simplify Self Join SQL

我目前正在執行以下聯接,並且執行查詢需要很長時間,是否可以使它運行更快? 我在表中有23個字段。 我在字段'id'(int)5 reg(varchar)9上有一個主鍵

SELECT a1.*, ( SELECT COUNT(reg) FROM auction a2 WHERE reg = a1.reg) AS c1 FROM auction a1


CREATE TABLE IF NOT EXISTS `db1` (
  `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
  `adate` varchar(10) NOT NULL,
  `lnu` int(4) NOT NULL,
  `reg` varchar(9) NOT NULL,
  `mk` varchar(50) NOT NULL,
  `mod` varchar(50) NOT NULL,
  `type` varchar(25) NOT NULL,
  `ree` varchar(50) NOT NULL,
  `co` varchar(50) NOT NULL,
  `fu` varchar(20) NOT NULL,
  `tran` varchar(20) NOT NULL,
  `mt` varchar(9) NOT NULL,
  `mile` int(6) NOT NULL,
  `ree` int(6) NOT NULL,
  `apv` int(6) NOT NULL,
  `ds` int(2) NOT NULL,
  `sr` varchar(50) NOT NULL,
  `sen` int(10) NOT NULL,
  `keep` int(2) unsigned NOT NULL,
  `tmp` char(1) DEFAULT NULL,
  `rk` varchar(100) DEFAULT NULL,
  `st` varchar(3) DEFAULT NULL,
  `dd` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `date` (`adate`)

如前所述,如果您唯一的索引是(id,reg)上的主鍵,那么通過單獨添加(reg)上的索引將大大加快此查詢的速度。

從您當前的模式看,您應該在reg列上提供了index

SELECT a1.*, a2.totalCount
FROM    auction a1
        INNER JOIN 
        (
            SELECT reg, COUNT(*)  totalCount
            FROM auction a2
            GROUP BY reg
        ) a2 
            ON a2.reg = a1.reg

您是否嘗試過使用子查詢:

SELECT a1.*, a2.cnt
FROM auction a1
INNER JOIN
(
    SELECT COUNT(reg) cnt, reg
    FROM auction
    GROUP BY reg
) a2
    on a1.reg = a2.reg

您有2個選擇:

  1. 在連接列上有一個索引,即reg。 這可能有助於加快查詢速度。

  2. 使用CTE。

使用CTE001 AS(選擇count( )作為GroupCount,從reg中的reg分組中選擇reg)選擇a。 ,來自CTE001的c.GroupCount c內部聯接拍賣a。c.reg = a.reg;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM