表模式是这样的:桌子设计之间的区别?
应用:
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