MySQL查询太慢了

时间:2014-01-09 07:13:10

标签: mysql sql indexing

在MySQL数据库中我有下表:

  • id int主键
  • 时间戳时间戳
  • tpid varchar
  • tpidno int
  • serialnumber int
  • 命令varchar
  • sequence int
  • startTime varchar
  • endTime varchar
  • PosData varchar
  • ...

我还有3个二级指数:

  1. TPID,tpidno
  2. SERIALNUMBER
  3. 命令
  4. 该表包含~2.5M行,约为500MB

    虽然我的复杂查询运行速度很快,但我对这两个简单的查询有很大的延迟:

    Select id, sequence, PosData 
      From myTable 
     Where  serialNumber = 130541  
       and command = "myCommand" 
       and startTime = "20140106194300" 
       and endtime = "20140106200000"
    

    (〜4.4sec)

    Select id 
      From myTable 
     Where  serialNumber = 130541  
       and command = 'myCommand' 
       and sequence = 128
    

    (〜4.5sec)

    更多指数如

    • serialnumber,command
    • 命令,序列

    • serialnumber,command,sequence

    会加快查询速度吗?

    在第一个查询中,startTime和endTime的数据类型是否可能成为问题?如果它们是int而不是varchar,那会更好吗?

    还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

(serialnumber, command)上的单个索引将最终提高这两个查询的效果。此外,您可以添加其他列以使其更快。但是,其他列的最佳选择取决于数据分布以及更常执行两个语句中的哪一个的问题。如果其他两列非常具有选择性,那么甚至可能不值得添加这些列。

startdateenddate的数据类型至少是不幸的。正确的类型将提高从“一点”到“很多”的范围内的性能,具体取决于您的SQL。上面的SQL将处于“一点”范围内。

一些参考: