0

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

Check_in 表通常包含 10,000 到 17,000 行。它还有一个索引:Num, unique = yes, cardinality = 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 整数 (6)
  • 姓氏 varchar (30)
  • travelerName varchar (40) (99.9% = '全部')
  • depTime 日期时间
  • fltNum varchar (6)
  • depCity varchar (4)
  • 总共 23 个字段(包括一个 blob,包含 25K 图像)

编辑:

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

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

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

对所有想法开放。感谢您的关注。

4

3 回答 3

1

如果不查看表定义,很难确切知道如何提供帮助。

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

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

您可能还想在

 (empNum,depCity,travelerName,depTime,fltNum)

优化自连接。您可能需要花点时间才能弄清楚什么是有效的。

于 2013-04-01T17:09:57.757 回答
0

索引的目的是加快搜索和过滤速度……索引(用外行的话来说)是一个排序表,它精确定位数据的每一行(它本身可能是未排序的)。

因此,如果您想加快删除查询的速度,了解数据的位置会有所帮助。因此,作为一组经验法则,您需要向以下字段添加索引:

  1. 每个主键或外键
  2. 您执行频繁搜索/过滤的每个日期
  3. 您执行频繁搜索/过滤的每个数字字段

我避免对文本字段进行索引,因为它们非常昂贵(就空间而言),但是如果您需要对文本字段执行频繁的搜索,您还应该对它们进行索引。

于 2013-04-01T18:28:52.287 回答
0

如果您的目标是删除重复项,则解决方案是首先避免出现重复项 - 在您认为共同定义重复项的字段中定义一个唯一索引(但您将无法创建索引,而您在数据库中有重复项)。

查询所需的索引按 (deptime,empnum,depcity,travellername,fltnum,num,accomp}的顺序打开。deptime 字段必须排在第一位,以优化表上的 2 次访问。一旦你删除重复项,使索引唯一。

暂且不说,您会遇到一大堆性能问题。

1)您似乎在提供某种商业服务 - 那么您为什么要等待您的 ISP 告诉您您的网站正在像狗一样运行?

2)虽然您的索引应设计为防止重复,但在许多情况下其他索引将有助于提高性能 - 但为了了解这些索引是什么,您需要查看针对您的数据运行的所有查询。

3)blob可能应该在一个单独的表中

他们能否在查询中(更早)更好地定位?

查询层次结构中同一级别的谓词顺序对性能没有影响。

第 5 个 AND 是必要的吗?

如果您的意思是“AND (Check_in.Num > vtable.Num)”,那么是的 - 否则它将删除所有重复的行 - 即它不会留下一行。

于 2013-04-01T19:15:49.157 回答