在为SQL Server定义索引(群集和非群集)时,您会考虑哪些事项?DB新手应该注意哪些反模式?请解释"为什么"或尽可能提供参考.
索引基本上是"备忘单".它允许DBMS在磁盘上查找特定值(或值范围),而无需扫描整个表.一般来说,你通过索引在INSERT/UPDATE/DELETE上付出一点点代价,但很少这么说它本身就是一个瓶颈.一个好的DBMS只会在它们帮助查询性能时使用索引,所以这里没有很多非常消极的反模式; 如果你有额外的索引,它通常不会对你造成太大伤害(除非你在谈论非常高度的事务表).也就是说,全面仔细索引将帮助您确保真正重要的索引存在,并且发现这一点的最佳方式是分析您的应用程序.
理解何时以及何时不使用索引的关键是要掌握他们在幕后真正做的事情.简而言之,当索引的选择性很高时(即,与关系的大小相比,不同可能值的数量较高),您需要它们.因此,例如,如果你有一个包含10,000行的表,并且你在该表上有一个名为"color"的列,它是"红色"或"蓝色",那么拥有索引并没有多大帮助,因为DBMS可能必须将大部分页面加载到内存中(假设随机分布).反过来,
大多数现代数据库系统中的索引都是使用B +树实现的,这是B-Tree的一种非常酷的变体,它针对慢速二级存储(磁盘而不是内存)进行了优化.您可以从数据库系统:完整的书中很好地介绍它们的使用和功能.