如何在不丢失数据的情况下优化 SQL 查询?
How to optimize SQL query without losing data?
我正在使用 MySQL 查询数据库 tables.
我终于发现下面的查询 returns 我想从我的数据库中得到什么。 (我不是SQL专家)
SELECT * FROM ( SELECT swtickets.ticketid, swtickets.ticketstatustitle, swtickets.departmenttitle, swtickets.subject, swtickets.dateline, swtickets.ownerstaffname, swtickets.lastreplier, swcustomfieldvalues.fieldvalue, swcustomfieldvalues.customfieldid FROM swtickets, swcustomfieldvalues WHERE swcustomfieldvalues.typeid=swtickets.ticketid AND swtickets.ticketid IN (SELECT typeid FROM `swcustomfieldvalues` WHERE `fieldvalue`=12345678)) as tbl
where tbl.customfieldid=123
但是,上述查询需要很长时间才能在 phpMyAdmin 中显示结果。
Showing rows 0 - 24 (32 total, Query took 7.1488 sec)
能否将此查询优化为快于 7 秒?
这是我的 SQL小提琴:
http://sqlfiddle.com/#!9/d3b5a2
更多解释:
Table: swcustomfieldvalues
customfieldvalueid
customfieldid
typeid <— This field is not unique in this table
fieldvalue
isserialized
isencrypted
dateline
uniquehash
lastupdated
对于每张票,我在 swcustomfieldvalues
中有 9 个自定义字段
每张工单的所有 9 个自定义字段都具有相同的 typeid
(= ticketid
in swtickes
table)。
如果customfieldid
= 6,则fieldvalue
保存用户全名
如果customfieldid
= 7,则fieldvalue
持有用户手机号码
如果我查询此 table 以获得 typeid=98765
我将得到 9 行都具有相同的 typeid 和 fieldvalue
和 customfieldid
等不同的值...
我想从这个结果(9 行)中得到 fieldvalue
值,其中 customfieldid=6
但前提是 fieldvalue=1234567
其中 customfieldid=7
我的查询中已经有了这个值 1234567
,所以我不关心它是否列在结果中。
更多解释:
所有当前答案都成功地为每张具有查询中提供的手机号码的票以及其他从“swtickets”出轨的票提取了这些行集table。
到目前为止我们在做什么:
搜索(查询)是在 customfieldid=7 和 fieldvalue = 0555.
条件下执行的
一切都很好。但我不希望字段值出现在结果中(我不关心它)我希望名称出现在我的行结果中。
只有在
的情况下,我才需要 customfieldid=6
行的 fieldvalue
customfieldid=7
的行有 fieldvalue=0555
两个查询的结果(我的和关于答案的):
你可以使用类似这样的东西来简化它,
SELECT
swtickets.ticketid,
swtickets.ticketstatustitle,
swtickets.departmenttitle,
swtickets.subject,
swtickets.dateline,
swtickets.ownerstaffname,
swtickets.lastreplier,
swcustomfieldvalues.fieldvalue,
swcustomfieldvalues.customfieldid
FROM swtickets
LEFT JOIN swcustomfieldvalues
ON
swcustomfieldvalues.typeid = swtickets.ticketid
AND
swcustomfieldvalues.fieldvalue = 12345678
AND
swcustomfieldvalues.customfieldid = 123
试试这个
select swtickets.ticketid, swtickets.ticketstatustitle, swtickets.departmenttitle, swtickets.subject, swtickets.dateline, swtickets.ownerstaffname, swtickets.lastreplier, swcustomfieldvalues.fieldvalue, swcustomfieldvalues.customfieldid
from swtickets
join swcustomfieldvalues ON (swtickets.ticketid = swcustomfieldvalues.typeid)
where swcustomfieldvalues.fieldvalue = 12345678 and swcustomfieldvalues.customfieldid=123
我正在使用 MySQL 查询数据库 tables.
我终于发现下面的查询 returns 我想从我的数据库中得到什么。 (我不是SQL专家)
SELECT * FROM ( SELECT swtickets.ticketid, swtickets.ticketstatustitle, swtickets.departmenttitle, swtickets.subject, swtickets.dateline, swtickets.ownerstaffname, swtickets.lastreplier, swcustomfieldvalues.fieldvalue, swcustomfieldvalues.customfieldid FROM swtickets, swcustomfieldvalues WHERE swcustomfieldvalues.typeid=swtickets.ticketid AND swtickets.ticketid IN (SELECT typeid FROM `swcustomfieldvalues` WHERE `fieldvalue`=12345678)) as tbl
where tbl.customfieldid=123
但是,上述查询需要很长时间才能在 phpMyAdmin 中显示结果。
Showing rows 0 - 24 (32 total, Query took 7.1488 sec)
能否将此查询优化为快于 7 秒?
这是我的 SQL小提琴:
http://sqlfiddle.com/#!9/d3b5a2
更多解释:
Table: swcustomfieldvalues
customfieldvalueid
customfieldid
typeid <— This field is not unique in this table
fieldvalue
isserialized
isencrypted
dateline
uniquehash
lastupdated
对于每张票,我在 swcustomfieldvalues
中有 9 个自定义字段
每张工单的所有 9 个自定义字段都具有相同的 typeid
(= ticketid
in swtickes
table)。
如果customfieldid
= 6,则fieldvalue
保存用户全名
如果customfieldid
= 7,则fieldvalue
持有用户手机号码
如果我查询此 table 以获得 typeid=98765
我将得到 9 行都具有相同的 typeid 和 fieldvalue
和 customfieldid
等不同的值...
我想从这个结果(9 行)中得到 fieldvalue
值,其中 customfieldid=6
但前提是 fieldvalue=1234567
其中 customfieldid=7
我的查询中已经有了这个值 1234567
,所以我不关心它是否列在结果中。
更多解释:
所有当前答案都成功地为每张具有查询中提供的手机号码的票以及其他从“swtickets”出轨的票提取了这些行集table。
到目前为止我们在做什么: 搜索(查询)是在 customfieldid=7 和 fieldvalue = 0555.
条件下执行的一切都很好。但我不希望字段值出现在结果中(我不关心它)我希望名称出现在我的行结果中。
只有在
的情况下,我才需要customfieldid=6
行的 fieldvalue
customfieldid=7
的行有 fieldvalue=0555
两个查询的结果(我的和关于答案的):
你可以使用类似这样的东西来简化它,
SELECT
swtickets.ticketid,
swtickets.ticketstatustitle,
swtickets.departmenttitle,
swtickets.subject,
swtickets.dateline,
swtickets.ownerstaffname,
swtickets.lastreplier,
swcustomfieldvalues.fieldvalue,
swcustomfieldvalues.customfieldid
FROM swtickets
LEFT JOIN swcustomfieldvalues
ON
swcustomfieldvalues.typeid = swtickets.ticketid
AND
swcustomfieldvalues.fieldvalue = 12345678
AND
swcustomfieldvalues.customfieldid = 123
试试这个
select swtickets.ticketid, swtickets.ticketstatustitle, swtickets.departmenttitle, swtickets.subject, swtickets.dateline, swtickets.ownerstaffname, swtickets.lastreplier, swcustomfieldvalues.fieldvalue, swcustomfieldvalues.customfieldid
from swtickets
join swcustomfieldvalues ON (swtickets.ticketid = swcustomfieldvalues.typeid)
where swcustomfieldvalues.fieldvalue = 12345678 and swcustomfieldvalues.customfieldid=123