[英]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.