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,
主键实际上是一个虚拟自动增量编号.它不是老实说.我无法访问解释计划.我会看到我能为此做些什么.
我很感激有任何帮助来改善这个.
好的,由于表范围分区位于 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)
如果我没有记错的话,这应该是您查询的最佳索引。
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |