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