内部查询多列一个数据库

时间:2018-04-27 11:48:56

标签: mysql sql performance

我在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。

2 个答案:

答案 0 :(得分:0)

保持与上次查询相同的结构,强烈建议:

  1. 如果您可以确保不会有重复项,请使用UNION ALL,速度要快得多。

  2. 而不是*列出了列的名称。

  3. 这两个基本提示将帮助您更快地执行。不要忘记索引表格。

答案 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相关联?这意味着重组架构。