数据库索引 - 表的大小是否重要?

问题描述:

我的意思是:具有20列的表格是否比只有4列的表格有更多的索引特定字段(用于搜索ish查询)的好处?数据库索引 - 表的大小是否重要?

另请参见:将索引添加到字段中有什么危害,我不会搜索太多,但可能在以后的将来?添加索引是否有负面影响?它只是它在磁盘上占用的大小,还是它可以让事情运行得更慢以添加不必要的索引?

从评论

我使用的是Postgres(最新版本)中提取,我有一个表,我会做很多喜欢类型的查询等,但价值无疑会因为经常改变我的客户可以访问CRUD。我应该可以创建索引吗?他们只是头痛吗?

与只有4列的表相比,索引某个字段(在搜索ish查询中使用的字段)有20列的表是否受益更多?

不,表中的列数与索引的好处没有关系。

索引仅指定列中的值;它会影响你的查询会看到多少好处的值的频率。例如,包含布尔值的列对索引来说是一个糟糕的选择,因为这个值是一个或另一个值的50/50。在所有行上以50/50分割时,索引不会缩小搜索特定行的范围。

将索引添加到字段中会带来什么样的危害,我不会搜索得太多,但可能会在以后出现?

索引只有在可以使用时才加快数据检索速度,但是它们会对INSERT/UPDATE/DELETE语句的速度产生负面影响。索引还需要维护以保持其价值。

+0

@OMG小马 - 感谢...拍摄。什么样的维护,以及多久? – orokusaki 2010-11-17 05:26:15

+0

@orokusaki:取决于数据库以及索引所在列的数据更改频率。 – 2010-11-17 05:27:22

+2

嗯,我会说“最小”而不是“没有”,更依赖于行的大小而不是列数(尽管后者影响前者)。对于较大的行,您的全表扫描将无法像读取行一样读取尽可能多的行(例如)只包含单列的行。因此,对于行大小为50K的表而言,索引该列的_improvement_大于具有10K行大小的行。正如你正确指出的那样,这种差异会被其他因素所淹没。 – paxdiablo 2010-11-17 05:32:17

如果您正在进行LIKE查询,您可能会发现索引无论如何不是很有帮助。虽然指数可能会提高此查询...

select * from t23 
where whatever like 'SOMETHING%' 
/

...这是不可能的指数将与这两种查询的帮助......

select * from t23 
where whatever like '%SOMETHING%' 
/

select * from t23 
where whatever like '%SOMETHING' 
/

如果你有自由文本字段和你的用户需要模糊匹配,那么你应该看看Postgres的全文功能。这使用MATCH运算符而不是LIKE,它需要一个特殊的索引类型。 Find out more.

有一个问题,那就是全文索引比正常指标更复杂,而且related design decisions are not simple。还有一些实现需要additional maintenance activities

+0

为什么第一个查询会加快,但不是第二个或第三个查询?我认为数据库会以相同的方式执行“like”搜索,但能够从索引值中进行搜索,而不是扫描整个表格,对所有3个查询基本上具有相同的效果(这是我的误解,当然,但我不知道为什么或如何)。我想我不明白指数如何加快速度。 – orokusaki 2010-11-17 19:26:19

+0

@orokusaki在电话簿中查找以'iith'结尾的内容还是以'Smi'开头的内容?由于第一个字母未知,后面的两个示例不能使用索引。应避免这些类型的查询。 – HLGEM 2010-11-17 21:48:25

+0

@HLGEM - 不要质疑你在这个问题上的权威,但这似乎不是一个有效的比较。首先,一个表格的数据不是按字母顺序排列的。其次,人类不容易扫描电话簿中每个姓名的最后3个字符,而数据库可以扫描列数据的数据'data [length - 3] - data [length]'的最后3个字符似乎是一个好方法把它(来自非DBA)。 – orokusaki 2010-11-21 02:43:03