提高查询性能以删除重复项

时间:2013-04-01 16:47:35

标签: mysql database query-optimization

我的托管公司最近从慢查询日志中给了我这个条目。检查的行似乎过多,可能有助于减慢服务器的速度。在phpMyAdmin中进行的测试导致持续时间为0.9468秒。

Check_in表通常包含10,000到17,000行。它还有一个索引:Num,unique = yes,基数= 10852,collat​​ion = 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() );

编辑:

  • empNum int(6)
  • lastName varchar(30)
  • travelerName varchar(40)(99.9%='All')
  • depTime datetime
  • fltNum varchar(6)
  • depCity varchar(4)
  • 总共23个字段(包括一个blob,持有25K图像)

编辑:

ADD INDEX deleteQuery (empNum, lastName, travelerName, depTime, fltNum, depCity, Num)

这是创建索引的问题吗?如果是这样,什么类型和什么领域?

最后3个条件通过询问是否完成以及在时间段内限制行数。他们可以在查询中更好地定位(早先)吗?第5 AND ...是必要的吗?

对所有想法持开放态度。谢谢你的期待。

3 个答案:

答案 0 :(得分:1)

如果没有看到表格定义,很难确切知道如何提供帮助。

不要删除自联接(两次提到的同一个表),因为此查询正在清除重复项(check_in.Num > vtable.Num)。

你有关于depTime的索引吗?如果没有,请添加一个。

您可能还想在

上添加复合索引
 (empNum,depCity,travelerName,depTime,fltNum)

优化自我加入。你可能不得不弄清楚什么有用。

答案 1 :(得分:0)

索引的目的是加快搜索和过滤...索引是(以外行的术语)一个排序表,它精确定位数据的每一行(可能本身未排序)。

因此,如果您想加快删除查询速度,则有助于了解数据的位置。因此,作为一组拇指规则,您需要将索引添加到以下字段:

  1. 每个主键或外键
  2. 您经常搜索/过滤的每个日期
  3. 您经常搜索/过滤的每个数字字段
  4. 我避免使用文本字段的索引,因为它们非常昂贵(就空间而言),但是如果你需要对文本字段进行频繁搜索,你也应该为它们编制索引。

答案 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。