Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-关于表分区/子分区的说明_Mysql_Database_Innodb_Database Partitioning - Fatal编程技术网

MySQL-关于表分区/子分区的说明

MySQL-关于表分区/子分区的说明,mysql,database,innodb,database-partitioning,Mysql,Database,Innodb,Database Partitioning,我有一张表,里面有大约3亿条记录,只保存了60天。这张桌子的结构很简单。。 它有12列,其中4列已编入索引: 还有一个唯一的索引: 其余字段只是主要由查询结果获取的值 数据库服务器已经进行了调整,具有良好的条件,缓冲区空间为12GB,等等 为了加快查询速度,我决定在LogTime字段上对表进行分区。通过使用分区范围对表进行分区,我实现了这个目标。现在,表1分区有365个分区,每个分区有500万条记录 问题是我们对查询性能不满意,我正在寻找一种方法将分区分解为更小的部分。。假设在LogTime和R

我有一张表,里面有大约3亿条记录,只保存了60天。这张桌子的结构很简单。。 它有12列,其中4列已编入索引:

还有一个唯一的索引:

其余字段只是主要由查询结果获取的值

数据库服务器已经进行了调整,具有良好的条件,缓冲区空间为12GB,等等

为了加快查询速度,我决定在LogTime字段上对表进行分区。通过使用分区范围对表进行分区,我实现了这个目标。现在,表1分区有365个分区,每个分区有500万条记录

问题是我们对查询性能不满意,我正在寻找一种方法将分区分解为更小的部分。。假设在LogTime和RegionID上划分一个表。。。我不确定它是否适用于子分区…

select  b.CityName, a.val1, a.val2
    from  DataRepo a
    left join  City b on a.CityID = b.CityID
    where  (a.LogTime >= '2015-08-01 00:00:00'
       and  a.LogTime <= '2015-08-05 00:00:00' )
      and  a.RegionID = 1
      and  a.ProvinceID = 14;
没有分区将有助于将查询的速度提高到该索引所能提供的速度之上

无关的 你是不是故意要检查4天加1秒钟

我喜欢这种设计模式:

    where  (a.LogTime >= '2015-08-01'
       and  a.LogTime <  '2015-08-01' + INTERVAL 4 DAY )
这样,查询将完全在索引中的连接之外执行,而不涉及数据。解释会说使用索引

另一个问题是,该地区是该省的一个子集吗?反之亦然?如果是这样,事实表中不需要两列,是吗?缩小事实表是提高性能的另一种技术,因为您无疑是受I/O限制的


更多是省INT?这是4个字节。如果不到255个省,请使用TINYINT UNSIGNED,它只有1个字节。这将在表中节省近1GB,再加上我建议的索引中的另一GB。

分区本质上不会提供任何性能。请向我们展示您需要更好性能的实际查询。索引和分区必须基于查询;事情进展缓慢。更多关于分区的信息:嘿,Rick,谢谢您的回复。这是我的一个示例查询,需要几分钟来反馈结果:从DataRepo a中选择b.CityName、a.val1、a.val2在a.CityID=b.CityID中左加入城市b,其中a.LogTime>='2015-08-01 00:00:00'和a.LogTime我现在可以确认的一件事是,您使用TinInit而不是INT可能是正确的,我会注意这一点。我对你提出的最佳指数有一个问题。。正如您在我的第一篇文章中看到的,我已经为相同的字段定义了唯一索引。。我看不出有什么不同。。你能在这里解释一下区别吗?谢谢。您的唯一密钥以LogTime开头。最后一个有用的列是范围列。这是你的将只过滤LogTime,必须扫描大量的行也过滤省和地区。我的索引使用了所有3列。你的可以通过重新安排变成我的。我想看到整个节目创建表格;可能还有其他需要批评的地方。对于300米行,许多细节变得非常重要。有300行,细节不重要。明白了:非常感谢您的时间。请允许我根据您的答复修改所需的字段/索引。我稍后会和你核对结果。附言:现在是凌晨4点;印度改变需要很长的时间,同时做所有的改变。并考虑使用PT在线模式更改。
select  b.CityName, a.val1, a.val2
    from  DataRepo a
    left join  City b on a.CityID = b.CityID
    where  (a.LogTime >= '2015-08-01 00:00:00'
       and  a.LogTime <= '2015-08-05 00:00:00' )
      and  a.RegionID = 1
      and  a.ProvinceID = 14;
INDEX(RegionID, ProvinceID, -- in either order
      LogTime)    -- last
    where  (a.LogTime >= '2015-08-01'
       and  a.LogTime <  '2015-08-01' + INTERVAL 4 DAY )
INDEX(RegionID, ProvinceID, -- in either order
      LogTime,    -- range
      CityID)     -- the rest of the fields used in the SELECT