我的托管公司最近从慢查询日志中给了我这个条目。检查的行似乎过多,可能有助于减慢服务器的速度。在phpMyAdmin中进行的测试导致持续时间为0.9468秒。
Check_in表通常包含10,000到17,000行。它还有一个索引:Num,unique = yes,基数= 10852,collation = A.
我想改进此查询。 WHERE之后的前五个条件包含要检查以丢弃重复项的字段。
# User@Host: fxxxxx_member[fxxxxx_member] @ localhost []
# Query_time: 5 Lock_time: 0 Rows_sent: 0 Rows_examined: 701321
use fxxxxx_flifo;
SET timestamp=1364277847;
DELETE FROM Check_in USING Check_in,
Check_in as vtable WHERE
( Check_in.empNum = vtable.empNum )
AND ( Check_in.depCity = vtable.depCity )
AND ( Check_in.travelerName = vtable.travelerName )
AND ( Check_in.depTime = vtable.depTime )
AND ( Check_in.fltNum = vtable.fltNum )
AND ( Check_in.Num > vtable.Num )
AND ( Check_in.accomp = 'NO' )
AND Check_in.depTime >= TIMESTAMPADD ( MINUTE, 3, NOW() )
AND Check_in.depTime < TIMESTAMPADD ( HOUR, 26, NOW() );
编辑:
编辑:
ADD INDEX deleteQuery (empNum, lastName, travelerName, depTime, fltNum, depCity, Num)
这是创建索引的问题吗?如果是这样,什么类型和什么领域?
最后3个条件通过询问是否完成以及在时间段内限制行数。他们可以在查询中更好地定位(早先)吗?第5 AND ...
是必要的吗?
对所有想法持开放态度。谢谢你的期待。
答案 0 :(得分:1)
如果没有看到表格定义,很难确切知道如何提供帮助。
不要删除自联接(两次提到的同一个表),因为此查询正在清除重复项(check_in.Num > vtable.Num
)。
你有关于depTime的索引吗?如果没有,请添加一个。
您可能还想在
上添加复合索引 (empNum,depCity,travelerName,depTime,fltNum)
优化自我加入。你可能不得不弄清楚什么有用。
答案 1 :(得分:0)
索引的目的是加快搜索和过滤...索引是(以外行的术语)一个排序表,它精确定位数据的每一行(可能本身未排序)。
因此,如果您想加快删除查询速度,则有助于了解数据的位置。因此,作为一组拇指规则,您需要将索引添加到以下字段:
我避免使用文本字段的索引,因为它们非常昂贵(就空间而言),但是如果你需要对文本字段进行频繁搜索,你也应该为它们编制索引。
答案 2 :(得分:0)
如果您的目标是删除重复项,解决方案是避免首先出现重复项 - 在您认为共同定义副本的字段中定义唯一索引(但您将无法创建你在数据库中有重复的索引。)
此查询所需的索引(deptime,empnum,depcity,travellername,fltnum,num,accomp} 按此顺序 .detime字段必须首先是为了优化桌面上的2次访问。一旦删除了重复项,就要使索引唯一。
暂时搁置一旁,你会遇到很多性能问题。
1)您似乎提供某种商业服务 - 那么您为什么要等待ISP告诉您您的网站像狗一样运行?
2)虽然您的索引应该设计为防止重复,但在很多情况下,其他索引将有助于提高性能 - 但为了了解您需要查看所有针对您的数据运行的查询。
3)blob可能应该在一个单独的表中
他们可以在查询中更好地定位(早先)吗?
查询层次结构中同一级别的谓词顺序对性能没有影响。
是第5个必要的吗?
如果您的意思是'AND(Check_in.Num&gt; vtable.Num)',那么是 - 如果没有它将删除所有重复的行 - 即它不会留下一行behid。