【问题标题】:Mysql Performance issue on large table大表上的Mysql性能问题
【发布时间】:2017-07-29 09:56:53
【问题描述】:

我在 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 位置添加索引 (tagCode,xLocation,yLocation, 位置日期);

如何提高性能?

【问题讨论】:

  • EXPLAIN 对此查询有何评论?使用BETWEEN 有帮助吗?
  • 您的查询和索引对我来说看起来是最佳的。如果其他列(例如 locationDate)上的一个具有比标记代码更低的基数,那么相应地重新排列索引可能是一个想法。
  • 单独在DB上执行的行为是否一致?
  • 我用解释运行查询,它说 | 1 |简单 |位置 |索引 |标记代码,标记代码_2 |标签代码 |第779章空 | 2319860 |使用哪里;使用索引 |
  • 看看这里。也许会有所帮助:gpshumano.blogs.dri.pt/2009/07/06/…

标签: php mysql innodb mariadb


【解决方案1】:

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

INDEX(tagCode, locationDate, xLocation, yLocation)

原因如下:

  • tagCode= 测试; WHERE 中的任何此类测试都需要首先出现在 INDEX 中。
  • 然后您在“范围”内获得一次机会。因为locationDate似乎是最有选择性的,所以我把它放在下一个。
  • 其余列用于使索引“覆盖”。也就是说,all SELECT 中提到的anywhere 列都在一个索引中。这样,可以在索引 BTree 中执行查询,而无需触及 Data BTree。

如果您的日期范围有时很宽,但 x 范围很窄,那么您添加的索引效果最好。所以,留着吧。并添加第三个:

INDEX(tagCode, yLocation, locationDate, xLocation)

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

【讨论】:

    【解决方案2】:

    最后,在我的公司,我们有 1100 万客户,因此通常在某些情况下,我们会创建一个按月或按地区分类的表格。

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

    协调员_03_2017 coodinator_02_2017

    这样您就可以同时进行多个线程查询。

    最后,您可以同时执行多个查询,将计算按时间间隔分开,例如:

    线程 1 - query1: locationDate > '2017-03-01 00:00:00' 线程 2-查询 2:locationDate > '2017-02-01 00:00:00' 和 locationDate

    【讨论】:

      【解决方案3】:

      当您执行 '>=' 时每个寄存器有两个比较,请尝试仅使用 '>'。

      另一件事:

       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 坐标。

      最后,尝试将条件放在首位,以消除更多不想要的行数。

      【讨论】:

      • 最后一件事,在我的公司,我们有 1100 万客户,所以一般情况下我们会为每个月创建一个表。
      • 另一个额外的东西?
      • 到目前为止,没有。如果我记得更多的东西,我会发布
      • BETWEEN&lt;=&lt; 之间基本上没有性能差异。每个人都进行某种形式的不等式测试。
      • DOUBLEINT 在性能上基本上没有区别。
      猜你喜欢
      • 2019-03-16
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2012-07-27
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多