表模式是這樣的:桌子設計之間的區別?
應用:
applicationid(pk)
userid(pk)
applicationname
服務:
serviceid(pk)
userid(pk)
applicationid
servicename
servicetype
version
modifieddate
我要編寫一個查詢來過濾所有記錄針對特定applciation特定用戶。 userid將有一個'common'值,在這種情況下,所有用戶都將訪問它,並且此常見記錄將具有版本'1'。 如果用戶'a'編輯記錄'common',則編輯的信息將被插入爲帶有用戶標識'a'和版本'2'的新記錄。 在這種情況下,在過濾時,我必須顯示,而不是'普通'記錄,但用戶的記錄版本爲'2'。 對於不對應於任何應用程序的服務,applicationid字段將爲'null',它們將被稱爲外部服務。
對於上述數據模型,我無法編寫將使用索引而不是範圍的過濾器查詢。
編輯: 我必須篩選特定用戶的特定應用程序中的所有記錄。在過濾時,我們必須考慮版本和用戶標識符上的上述要點。所以,過濾約束變得太複雜了。
使用應用程序表是因爲我必須在applicationid不爲空時顯示應用程序名稱[如果服務對應於應用程序]。
說,查詢變得像,
select ser.*,app.applicationname
from services ser
left join applications app
on ser.userid = app.userid and ser.applicationid = app.applicationid
where (ser.userid = 'user1' OR ser.userid = 'common')
AND (ser.applicationid = 'appid1' OR ser.applicationid IS NULL)
AND (ser.modifieddate < '9999-01-01 00:00:00' OR (ser.modifieddate = '9999-01-01 00:00:00' AND ser.serviceid > ' \n'))
AND ser.version = (select max(ser1.version)
from services ser1
where (ser1.userid = 'user1' OR ser1.userid = 'common')
AND (ser1.applicationid = 'appid1' OR ser1.applicationid IS NULL)
AND ser1.servicename = ser.servicename)
ORDER BY ser.modifieddate,ser.serviceid
LIMIT 0,50
但性能較差,此查詢。我想優化它。子查詢和聯接使用索引(applicationid,servicename)和(userid,applicationid)大約需要2s。但無論我做什麼,我都無法讓外部查詢佔用任何索引。有什麼建議麼?
請你幫我
- 要在一個更好的查詢計劃到達?
- 或重新設計表格?
服務表DDL不清楚。請詳細說明我們的要求 – 2012-01-10 09:35:09
我已經添加了一些更多的細節..希望這有助於更好地理解.. :) – Sowmiya 2012-01-10 10:15:49