讓我更詳細地解釋一下......
我有一個這樣的mysql表:
| session_id | session_start | session_end |
|------------|---------------------|---------------------|
| 1 | 2016-01-01 01:00:00 | 2016-01-01 01:03:00 |
| 2 | 2016-01-01 03:00:00 | 2016-01-01 03:02:24 |
| 3 | 2016-01-01 03:35:00 | 2016-01-01 03:37:02 |
| ... | ... | ... |
session_start不同行之間的時間間隔session_end從不重疊。每個會話指的是兩個用戶之間交換訊息的聊天對話。
我還有一個 mongoDB,對于每個檔案,我存盤帶有接收日期/時間戳的文本訊息,呼叫它event_date。但是,該檔案沒有說明該訊息屬于哪個會話。因此,我們可以將 mongoDB 檔案與 mysql 表中的會話匹配的唯一方法是 if event_dateis between session_startandsession_end用于 mysql 中的某些記錄,然后檢索session_id.
我目前的解決方案是運行這樣的查詢(我正在使用 mysql 庫在 python 中作業),在偽代碼中:
for event_date in all_event_dates:
cursor.execute("SELECT session_id
FROM session_table
WHERE %s >= session_start
AND %s <= session_end",
(event_date, event_date))
row = cursor.fetchone()
但這是一個非常緩慢的程序,因為串列的長度all_event_dates約為 100k。是否有更有效的查詢,我可以一次運行多個event_date值?
非常感謝提前
uj5u.com熱心網友回復:
將所有事件日期加載到臨時表中,然后加入。
cursor.execute("CREATE TEMPORARY TABLE event_dates (event_date DATETIME)";
cursor.executemany("INSERT INTO event_dates VALUES (?)", [(date,) for date in all_event_dates])
connection.commit()
cursor.execute("""
SELECT session_id
FROM session_table AS s
JOIN event_dates AS e ON e.event_date BETWEEN s.session_start AND s.session_end""")
rows = cursor.fetchall()
uj5u.com熱心網友回復:
因為它們不重疊,所以
SELECT session_id
FROM session_table
WHERE %s >= session_start
ORDER BY session_start
LIMIT 1
并將其放在桌子上:
INDEX(session_start, session_id)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467570.html
