确保MySql表中的某些默认排序顺序

确保MySql表中的某些默认排序顺序,mysql,sql,database-design,Mysql,Sql,Database Design,我有一个超过1100万行的大型MySql表。这只是一个庞大的数据集,我的任务是能够根据某些规则分析数据集 每一行都属于某个类别。有200万个不同的类别。我想获取一个类别的所有行并对其执行操作 因此,目前,我做了以下工作: 从表中选择不同的类别 对于每个类别:从表中选择字段,其中类别=类别 即使我的category列被编入索引,执行步骤2也需要很长时间。这主要是因为庞大的数据集 或者,我可以使用GROUP BY子句,但是我不确定它是否会像GROUP BY子句那样快,因为在这样一个巨大的数据集上使用

我有一个超过1100万行的大型MySql表。这只是一个庞大的数据集,我的任务是能够根据某些规则分析数据集

每一行都属于某个
类别
。有200万个不同的类别。我想获取一个类别的所有行并对其执行操作

因此,目前,我做了以下工作:

  • 从表中选择不同的类别
  • 对于每个类别:从表中选择字段,其中
    类别
    =类别
  • 即使我的
    category
    列被编入索引,执行
    步骤2也需要很长时间。这主要是因为庞大的数据集

    或者,我可以使用GROUP BY子句,但是我不确定它是否会像GROUP BY子句那样快,因为在这样一个巨大的数据集上使用GROUP BY可能会很昂贵,特别是考虑到我将在数据集的某些部分上运行多次分析时。一种永久性地确保已排序表的方法将非常有用

    因此,作为另一种选择,如果我的表是按
    类别预先排序的,我可以加快查询速度。现在我可以逐行读取表,并以更快的速度执行相同的操作,因为一个
    类别的所有行都将连续获取

    由于数据集(MySql表)是固定的,不会对其执行更新、删除、插入操作。我希望能够通过
    category
    确保维护默认排序顺序。有人能提出一个技巧来确保行的默认排序顺序吗

    可以读取所有行并将它们重写到新表中,或者添加一个新的主键以确保此顺序

    即使我的分类列已编入索引

    是否由次级索引索引?如果是这样,您可能会遇到以下性能问题:

    • InnoDB表始终是可用的,聚集表中的二级索引可能需要双重查找(请参阅中的“聚集的缺点”)
    • 索引行可以分散在所有地方(索引可能有错误-链接适用于Oracle,但原理相同)。如果是这样,索引范围扫描(例如
      其中category=which
      )可能会加载许多表页,即使实际使用了索引并且只选择了一小部分行。这可能会破坏范围扫描性能

    在替代二次索引时,考虑使用自然主键,Innabl表中的主键也用作群集键。诸如

    {category,no}
    之类的主键/集群键将使同一类别的行在物理上保持在一起,从而使两个查询(尤其是第二个查询)的效率最高


    Otoh,如果要保留二次索引,请考虑所有查询的字段,因此根本不必触摸主B-树。

    < P>可以通过一个步骤来完成这一点,而不必通过类似(伪代码):< /P>索引来进行索引。 有了分类上的索引,我希望它能正常运行。您的性能问题可能取决于您在处理每一行时所做的工作


    下面是一个示例:

    请显示表定义和查询。索引实际上是“预排序”。表的聚集索引是最接近预排序表顺序的概念。MySQL在如何定义这些方面比其他DBMS有一点限制:您研究过分区吗?谢谢您提供的信息。实际上,我只是想知道是否有一种“预排序”的方法,这样可以确保一个简单的select语句将返回按类别分组的行。(我不想在我的应用层显式地这样做)@amulayakhare你真的关注我提供的链接了吗?集群正是您需要的“预排序”。
    Declare @LastCategory int = Null
    Declare @Category int
    
    For Each Row In
    Select
      @Category = Category,
      ...
    From
      Table
    Order By 
      Category
    
      If @LastCategory Is Null Or @LastCategory != @Category
        Do any "New Category Steps"
        Set @LastCategory = @Category
      End
      Process Row
    
    End For