2017-03-08 76 views
1

我在使用mysql上的大型表时遇到问题。大型表上的Mysql性能问题

我有超过2.5百万的数据表。这是我的问题。

select count(*) from location 
    where tagCode=24345 
    and xLocation >=81 and xLocation <=264 
    and yLocation >=356 and yLocation <=484 
    and locationDate >= '2017-03-08 00:00:01' and locationDate <= '2017-03-08 11:54:01'; 

我想获得该查询计数的数量。但它的行数超过1秒。这导致了问题。

我在表中添加了索引。

ALTER TABLE位置ADD INDEX(tagCode,xLocation,yLocation, locationDate);

如何提高性能?

+1

'EXPLAIN'对此查询有何说法?使用'BETWEEN'是否有帮助? – tadman

+0

您的查询和索引对我来说看起来是最优的。如果其他列(例如locationDate)上的一个具有较低的基数然后标记代码,则可以相应地重新排列索引。 – Strawberry

+0

单独在数据库上执行时行为是否一致? – chris85

回答

-1

当你做'> ='是每个寄存器的两个比较,试试'>'。

另一件事:

locationDate >= '2017-03-08 00:00:01' and locationDate <= '2017-03-08 11:54:01' 

我想象的要一个位置,直到“现在”,如果我是正确的尝试只是较低条件

locationDate >= '2017-03-08 00:00:01' 

更多一点,尝试创建隔离索引如

locationDate DESC 
tagCode ASC 
xLocation ASC 
yLocation ASC 

如果将xLocation和yLocation声明为double,则像Googl电子坐标。

最后一件事,试着先把条件消除更多数量的不需要的行。

+0

最后一件事,在我的公司我们有1100万的客户,所以一般情况下我们会为每个月创建一张表。 –

+0

另外一件事? – nikoskip

+0

直到现在,没有。如果我还记得更多,我会发帖 –

0

最后一件事,在我的公司我们有1100万的客户,所以一般情况下我们会为每个月或每个地区创建一张表格。

在你的情况下,基于LocationDate,马贝您可以创建每月一个表太像:

coordinator_03_2017 coodinator_02_2017

所以你可以做多个线程同时查询。

最后一件事,你可以同时做多querys,分离每间隔couting的,如:

线程1 - QUERY1:locationDate> '2017年3月1日00:00:00' 主题2-查询2:locationDate>'2017-02-01 00:00:00'和locationDate <'2017-03-01 00:00:00' 线程N - 查询N

+0

嘿,把它放在你的第一个答案!编辑它 – DevMoutarde

+0

对不起,我真的没有在这里找到这个编辑选项。 –

0

x和y坐标很难索引。然而,这可能至少对于给定的例子中工作得很好,

INDEX(tagCode, locationDate, xLocation, yLocation) 

这里是理由:

  • tagCode=测试; WHERE中的任何此类测试都需要在INDEX中排在第一位。
  • 然后你得到一个几率在一个“范围”。由于locationDate似乎是最有选择性的,我把它下。
  • 其余的列是使索引“覆盖”。也就是,全部列中提到的中的任何一个SELECT都在单个索引中。这样,可以在索引BTree中执行查询,而不需要触摸数据BTree。

如果您有时日期范围较宽,但范围较窄,那么您添加的索引效果最佳。所以,保持它。并添加第三个:

INDEX(tagCode, yLocation, locationDate, xLocation) 

这样,优化程序可以从三个范围中挑选并可能选择最优的一个。