决定何时在数据库中的表列上创建索引?

M S*_*ach 32 sql oracle indexing

我不是db guy.但我需要创建表并对它们执行CRUD操作.如果我默认在所有列上创建索引,我会感到困惑吗?这是我在创建索引时考虑的理解.

索引基本上包含内存位置范围(第一个值存储的起始内存位置到存储最后一个值的最终内存位置).因此,当我们在表索引中插入任何值时,需要更新列,因为它还有一个值,但列值的更新不会对索引值产生任何影响.对?所以底线是当我的列用于两个表之间的连接时,我们应该考虑在连接中使用的列上创建索引,但是可以跳过所有其他列,因为如果我们在它们上创建索引,则会在新值时涉及更新索引值的额外成本插入列中.对?

考虑这种情况,其中表格mytable包含两个三列,即col1,col2,col3.现在我们解雇这个查询

select col1,col2 from mytable
Run Code Online (Sandbox Code Playgroud)

现在这里有两种情况.在第一种情况下,我们在col1和上创建索引col2.在第二种情况下,我们不创建任何索引.**根据我的理解案例1将比case2快,因为在案例1中我们oracle可以快速找到列内存位置.所以这里我没有使用任何连接列,但仍然索引在这里帮助.那么我应该考虑在这里创建索引吗?**

如果在上面的相同场景中,如果我们开火了怎么办

select * from mytable
Run Code Online (Sandbox Code Playgroud)

代替

select col1,col2 from mytable
Run Code Online (Sandbox Code Playgroud)

索引会在这里帮忙吗?

san*_*lto 33

不要在每一列中创建索引!它会减慢插入/删除/更新操作的速度.

作为一个简单的提示,你可以创建,在常见列的索引WHERE,ORDER BYGROUP BY条款.您可以考虑在用于关联其他表的列中添加索引(JOIN例如,通过a )

例:

SELECT col1,col2,col3 FROM my_table WHERE col2=1
Run Code Online (Sandbox Code Playgroud)

在这里,在col2上创建索引将有助于此查询.

另外,考虑索引选择性.简单地说,在具有"大域"的值上创建索引,即Ids,名称等.不要在Male/Female列上创建它们.


Ian*_*ter 15

但是列值的更新不会对索引值产生任何影响.对?

否.更新索引列会产生影响.Oracle 11g 性能手册指出:

修改索引列的UPDATE语句和修改索引表的INSERT和DELETE语句比没有索引的时间要长.此类SQL语句必须修改表中索引和数据中的数据.他们还创建了额外的撤消和重做.


所以底线是当我的列用于两个表之间的连接时,我们应该考虑在连接中使用的列上创建索引,但是可以跳过所有其他列,因为如果我们在它们上创建索引,则会在新值时涉及更新索引值的额外成本插入列中.对?

不只是插入,而是任何其他数据操作语言语句.

考虑这种情况...索引会在这里帮忙吗?

关于最后一段,为什么不构建一些具有代表性数据量的测试用例,以便证明或反驳您应该索引哪些列的假设?