簡體   English   中英

帶聯接的SQL查詢的速度很慢,可能是索引問題

[英]Speed is slow in SQL query with a join, maybe indexes are the problem

我目前正在處理一個大表(行數為15萬,正在計數),雖然表較小,但是我嘗試的查詢速度卻要快得多,但是隨着它的增長,它的運行速度非常慢,即使我限制為1,它也可能占用最多5分鍾。 我需要加快速度。

有兩個表,一個用戶表(大約5000條記錄)和一種歷史表(大約150,000條記錄),該表具有兩列日期和該日期的狀態。

該查詢是一個選擇,用於查找在給定日期沒有歷史記錄的用戶。

我目前正在嘗試做的事情如下:

select 
  u.user_id 
from 
  users u 
  left join history h on u.id= h.user_id and date = '20101116' 
where 
  date IS NULL;

這是怎么工作的,我要加入日期20101116 (YYYYMMDD格式),並且如果該加入表的日期值為null ,那么我知道我沒有給定日期的歷史記錄。 這行得通,但它的運行速度令人難以置信,我想知道是否有更快/更明智的方法。

因此,我的表是:

使用者

+------+-----------------+
|  id  |  email_address  |
+------+-----------------+

歷史

+------+-----------+--------+----------+
|  id  |  user_id  |  date  |  status  |
+------+-----------+--------+----------+

我只有兩個表的ID列上都有索引。

該查詢是一個選擇,用於查找在給定日期沒有歷史記錄的用戶。

select u.user_id 
from users,  history h
where u.user_id = h.user_id 
and not exists ( select 1 
                 from history 
                 where h.user_id = u.user_id 
                 and h.date = '20101116' )

WHERE日期為空沒有任何理由,因為您已經在特定日期加入。 對我而言,這沒有任何意義。 除非您談論的是兩個不同的日期字段,但在示例中沒有對它們命名或別名很好?

在這種查詢上沒有太多優化方面的內容。 您能做的最好的事情是在user_id以及日期上添加一個索引。

select u.user_id 
from users u 
where u.user_id not in (select h.user_id from history h where h.date = '20101116');

為了使查詢更快,您需要在history表中添加兩個索引:

  • history.user_id索引
  • history.date索引

嘗試創建這些,然后重新運行查詢。 您應該看到性能大大提高。

暫無
暫無

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

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