Mysql在大表上的性能问题

时间:2017-03-08 17:29:05

标签: php mysql innodb mariadb

我在mysql上遇到大表的问题。

我在桌上有超过250万的数据。这是我的疑问。

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 location ADD INDEX(tagCode,xLocation,yLocation,   locationDate);

如何提高性能?

3 个答案:

答案 0 :(得分:0)

最后,我公司有1100万客户,所以一般情况下我们会根据每个月或每个地区创建一个表格。

在您的情况下,基于LocationDate,mabe您也可以每月创建一个表,例如:

coordinator_03_2017 coodinator_02_2017

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

最后,您可以同时执行多个查询,将每个区间的couting分开,例如:

主题1 - query1:locationDate&gt; '2017-03-01 00:00:00' 线程2-查询2:locationDate&gt; '2017-02-01 00:00:00'和locationDate&lt; '2017-03-01 00:00:00' 线程N - 查询N

答案 1 :(得分:0)

x和y坐标很难索引。但是,这可能效果很好,至少对于给出的示例

INDEX(tagCode, locationDate, xLocation, yLocation)

以下是理由:

  • tagCode已使用=进行测试; WHERE中的任何此类测试都需要先来INDEX
  • 然后你会在&#34;范围&#34;中获得一个的机会。由于locationDate 似乎是最具选择性的,所以我把它放在旁边。
  • 其余的列是使索引&#34;覆盖&#34;。也就是说,{em>所有 SELECT所有所提到的列都在一个索引中。这样,可以在索引BTree中执行查询,而无需触及数据BTree。

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

INDEX(tagCode, yLocation, locationDate, xLocation)

这样,优化器可以在三个范围内进行选择,并且很可能选择最佳范围。

答案 2 :(得分:-1)

当你执行'&gt; ='是每个寄存器的两次比较时,请尝试'&gt;'。

另一件事:

 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,则更改为int,如Google坐标。

最后,尝试先排除条件,以消除更多不需要的行。