SQL - 加速查询

use*_*ju7 8 mysql sql query-optimization

我目前使用以下查询,由于数据量(约14个月),大约需要8分钟才能返回结果.有没有办法可以加快速度呢?

有问题的数据库是带有InnoDb引擎的MySQL

select
    CUSTOMER as CUST,
    SUM(IF(PAGE_TYPE = 'C',PAGE_TYPE_COUNT,0)) AS TOTAL_C,
    SUM(IF(PAGE_TYPE = 'D',PAGE_TYPE_COUNT,0)) AS TOTAL_D
from
        PAGE_HITS
where
    EVE_DATE >= '2016-01-01' and EVE_DATE <= '2016-01-05'
    and SITE =  'P'
    and SITE_SERV like 'serv1X%'
group by
    CUST
Run Code Online (Sandbox Code Playgroud)

数据分区为6个月.进入where子句的每一列都被编入索引.有一些相当多的索引,这将是一个很大的列表,在这里列出.因此,只需用文字进行总结.对于该查询,EVE_DATE + PAGE_TYPE_COUNT是复合指标之一&所以是CUST + SITE_SERV + EVE_DATE,EVE_DATE + SITE_SERV,EVE_DATE + SITE,

主键实际上是一个虚拟自动增量编号.它不是老实说.我无法访问解释计划.我会看到我能为此做些什么.

我很感激有任何帮助来改善这个.

Tho*_*ner 2

好的,由于表范围分区位于 EVE_DATE,DBMS 应该可以轻松地看到要读取哪个分区。所以这就是关于使用什么索引的问题。

您检查一列是否相等 ( SITE = 'P')。这应该在你的索引中排在第一位。然后你可以按照我猜的任何顺序添加EVE_DATEand 。SITE_SERV因此,您的索引应该能够尽快找到有问题的表记录。

但是,如果您将查询中使用的其他字段添加到索引中,则甚至不必读取该表,因为所有数据都在索引本身中可用:

create index on page_hits(site, eve_date, site_serv, customer, page_type, page_type_count);
Run Code Online (Sandbox Code Playgroud)

如果我没有记错的话,这应该是您查询的最佳索引。