设计数据库以有效搜索特定列的最佳方法是啥?
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 个唯一列的简单表的最佳方法是啥?