设计数据库以有效搜索特定列的最佳方法是啥?

Posted

技术标签:

【中文标题】设计数据库以有效搜索特定列的最佳方法是啥?【英文标题】:Which is the best way to design a database for searching a particular column efficiently?设计数据库以有效搜索特定列的最佳方法是什么? 【发布时间】:2012-04-20 05:59:40 【问题描述】:

我有一个包含以下字段的数据库表 tblDetails:

itemID(int)(primary), itemCode(varchar), itemName(varchar),itemDescription(varchar)

现在这个表有超过 50,000 行,并且会不断增加。当用户输入 itemCode 时,查询应该遍历整个表来检查用户输入的 itemCode 是否有效。所以我担心的是随着行数的增加,搜索数据库所消耗的时间。

有没有更好的方法来搜索数据库?有更好的数据库设计吗?查询 5 万行需要多少时间(大约)?

请提出建议。

【问题讨论】:

您能用您正在使用的正确关系型数据库(mysql、oracle 等)重新标记您的问题吗? 【参考方案1】:

在itemCode上创建一个索引,如果itemCode对你的表来说是唯一的,那么把它设为主键,它会得到一个聚集索引,访问起来会更快

【讨论】:

好的,谢谢。搜索 5 万行大约需要多少时间? 不能告诉你,这取决于很多变量 对索引的相等性检查非常快(特别是如果您重复查询该索引将在内存中)。 5 万行并不是很多。 @sangam254,如果您定义了正确的索引,您只能访问索引中的一两页并选择实际行。【参考方案2】:

如果您在itemCode 上设置索引,则对该列的搜索将不再是线性的。

您使用的任何数据库都应采用平衡树的方法来搜索该索引列。

【讨论】:

【参考方案3】:

其他人已经解释了你应该在itemCode上放一个索引,我来回答一下搜索需要多少时间:50000个值的B树索引大概有3层左右,所以需要3磁盘读取将相关节点带入内存。即使是便宜的机械驱动器每秒也能进行大约 100 次读取,因此您的搜索将花费大约 1/30 秒。

不过,这是最坏的情况。缓存相关页面后,您很可能能够在 0 次磁盘读取中进行搜索,这基本上是瞬时的。

顺便说一句,在数据库的上下文中,50000 确实。正确的索引将使您能够在数量级更大的数量上进行真正的快速搜索。 5000000 个值的 B 树可能有 4 层左右,500000000 个值有 5 层深等等......(只是示例数字,YMMV)。这是一个对数依赖关系,这意味着您的搜索速度比元素数量增加的慢得多。

有关该主题的更多信息,我强烈建议您阅读Anatomy of an SQL Index。

【讨论】:

以上是关于设计数据库以有效搜索特定列的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在另一个数组内的数组中搜索对象的最佳/最有效方法是啥?

在这种情况下,设计这个具有 3 个唯一列的简单表的最佳方法是啥?

查找数字 n 是不是包含特定数字 k 的最有效方法是啥?

基于原始列的 dtype 是对象,在数据框中创建多个虚拟变量的最佳方法是啥?

允许用户即时向其数据库添加列的最佳方式是啥? [关闭]

基于需要外部 API 调用的现有列创建新的 Spark 数据框列的最佳方法是啥?