关于字符串的SQL索引有用吗?

时间:2014-02-10 22:48:41

标签: mysql indexing

所以我在小型项目中使用MySQL,用于学校;但是,我并没有接管一个企业级的项目,现在速度很快,而不仅仅是获得正确的信息。我已经搜索了很多东西,试图了解索引如何使我的网站更快,我希望进一步了解它们的工作方式,而不仅仅是何时使用它们。

所以,我发现自己做了很多SELECT DISTINCTS以获得所有不同的值,所以我可以填充我的下拉列表。我听说如果这个专栏被索引,这会更快;但是,我不完全理解为什么。如果这列中的值是整数,我完全理解;基本上会创建像BST这样的数据结构,搜索时间可以是Log(n);但是,如果我的列是字符串,它怎么能把字符串放在BST中?这似乎不可能,因为没有度量标准来比较字符串与另一个字符串(就像有数字一样)。看起来索引只是创建该列的所有可能值的列表,但似乎搜索仍然需要数据库遍历每一行,使得此搜索成为线性,就像数据库刚刚扫描一样一张普通的桌子。

我的第二个问题是数据库在索引数据结构中找到正确的值后会做什么。例如,假设我正在使用年龄= 42的位置。因此,数据库会遍历数据结构,直到找到42,但它如何将查找映射到整行?索引是否有某种与之关联的行号?

最后,如果我正在做这些频繁的SELECT DISTINCT语句,那么添加一个索引会有帮助吗?我觉得这对于网站来说一定是一个常见的任务,因为许多网站都有可以过滤结果的下拉菜单,我只想弄清楚我是否正确地接近它。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您的字符串类似于类别,那么索引将有所帮助。如果您有大量随机文本,那么您可能需要全文索引。如果您不得不经常使用select distinct,那么您的数据库可能无法针对您正在进行的操作进行正确的规范化。您还可以将不同的值放在一个单独的表中(只有不同​​的值),但这只有在内容不会发生很大变化时才有用。索引策略特定于应用程序的访问模式,数据本身以及表的规范化(或不规范化)。 HTH

答案 1 :(得分:1)

您的逻辑很好,但是,您假设没有将字符串与其他字符串进行比较的度量标准是不正确的。字符串可以简单地按字母顺序进行比较,为它们提供一个完全可用的比较指标,可用于构建索引。

比较字符串需要花费更长的时间然后才能进行整理,但是,无论比较成本如何,索引仍然会加快速度。

我想提一下,如果您正在使用SELECT DISTINCT,那么您的数据库架构可能存在问题。

您应该了解规范化数据库。我建议从这个链接开始:http://databases.about.com/od/specificproducts/a/normalization.htm

规范化将为您提供查询机制,该机制远远超过从索引中获得的好处。