我在SQL Table上。它存储用户正在执行的任务。该表有1个主键(auto_generated)。它有4列,比方说:名称, BadgeID , LoginID ,任务,用户可以在其上查询 Name,BadgeID或LoginID 列以获取数据。在所有3列上创建索引。但是Column中的数据是相互关联的。
例如,表:
PrimKey Name BadgeID LoginID Task
1 John Wick 1234 wick Entered Office
2 1234 Printing
3 John Wick 6789 jwic Entered Office
4 Max Payne payn Printing
在进入Office时,用户必须提供名称,并且他必须提供至少一个BadgeID或LoginID,他也可以同时提供。对于Printing Task,他必须仅提供BadgeID或LoginID。如果您使用办公室以外的打印机,也可以在不进入办公室的情况下执行打印任务。
对于查询数据库,用户可以使用Name,BadgeID或LoginID中的任何一个查询表。
如果用户使用Name = John Wick
查询,那么他应该获得所有3个结果。
如果用户使用BadgeID = 1234
查询,那么他应该得到1和2,如果他用BadgeID = 6789
查询,那么他应该只得到3。
如果用户使用LoginID = wick
进行查询,那么他应该获得1和2,如果他使用LoginID = jwic
查询,那么他应该只获得3。
我写的SQL查询是:
以下查询需要15秒:
SELECT *
FROM table
WHERE (BadgeID IN (select distinct BadgeID
from table
WHERE ${idType} = ${id})
OR LoginID IN (select distinct LoginID
from table
WHERE ${idType} = ${id}))
进一步优化:
SELECT *
FROM table
WHERE BadgeID IN (select distinct BadgeID
from table
WHERE ${idType} = ${id})
UNION
SELECT *
FROM table
WHERE LoginID IN (select distinct LoginID
from table
WHERE ${idType} = ${id});
第二个查询速度稍微快一点,但看起来很难看,不可读。有没有办法可以通过扫描表两次而不是3次来实现?
P.S。我正在使用MySql-5.6。
答案 0 :(得分:0)
保持与上次查询相同的结构,强烈建议:
如果您可以确保不会有重复项,请使用UNION ALL
,速度要快得多。
而不是*
列出了列的名称。
这两个基本提示将帮助您更快地执行。不要忘记索引表格。
答案 1 :(得分:0)
数据存储区是数据存储库,而不是格式化引擎。
“如果用户使用LoginID = wick进行查询,那么他应该得到1和2” - 这应该存储在表中!
在输出中消隐e(arg)
是一个格式问题,由应用程序执行!
也许您需要一个包含select
*, min(case when Flag="True" then Date end) as First_Date into Schema.Want
from Schema.Have group by Patient_ID
和wick
的单独表格,以便BadgeID
始终与LoginID
相关联?这意味着重组架构。