【问题标题】:mysql query using partition name vs where clausemysql查询使用分区名称与where子句
【发布时间】:2020-02-08 22:15:01
【问题描述】:

我有一个按日期分区的表。我注意到当我使用分区名称查询表时,它比使用 where 子句查询要快。

例如:

select max(db_load_timestamp) from my_table partition(p20191008);(9 秒后执行)

更快地给出结果

select max(db_load_timestamp) from my_table where date='2019-10-08';(50秒后执行)

知道为什么会发生这种情况,因为两个查询都需要大约相等的时间,因为两个查询都利用了使用分区?

【问题讨论】:

  • 请提供SHOW CREATE TABLE;听起来有些不对劲。
  • 特别是你有INDEX(db_load_timestamp)吗?
  • @RickJames,不,db_load_timestamp 上没有索引。

标签: mysql partition database-partitioning


【解决方案1】:

当您使用分区时,您会限制访问的数据量。我找到了这句话:

分区允许将表、索引和按索引组织的表细分为更小的部分,因此只访问一小部分数据的查询可以运行得更快,因为要扫描的数据更少。

At this link

注意根据the documentation,不推荐使用分区...

【讨论】:

  • 不,不推荐使用分区。在 8.0 中消失的是处理分区的地方。它曾经在 SQL 层中处理,并且可供所有处理它的引擎使用。在 8.0 中,它仅在 InnoDB 引擎中。无论如何,MyISAM 即将被删除。
  • @Rick James - 感谢您的评论。分区也在 NDB 引擎中(根据我上面发布的链接,我没有尝试过。)为清楚起见,不推荐使用通用分区,并且正如您所指出的,并非所有存储引擎都会提供分区。在我在上面发布的链接中,它清楚地指出:“从 MySQL 5.7.17 开始,MySQL 服务器中的通用分区处理程序已被弃用,并在 MySQL 8.0 中被删除,当预期用于给定表的存储引擎提供其自己的(“本机”)分区处理程序。目前,只有 InnoDB 和 NDB 存储引擎执行此操作。”
  • 不太明显的关键字是“handler”。
【解决方案2】:

你是否使用分区:

INDEX(db_load_timestamp)

会有帮助

select max(db_load_timestamp) from my_table

还有……

INDEX(date, db_load_timestamp)

会有帮助

select max(db_load_timestamp) from my_table where date='2019-10-08';

在这两种情况下,结果在非分区表上的返回速度应该很快,以至于您甚至不会考虑使用分区。

这个答案的寓意:拥有最佳索引通常比分区更重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2023-04-09
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多