“我们应该忘记效率低下的问题,大约有97%的时间是这样:过早的优化是万恶之源。” (唐纳德·努斯)。我的SQL表不太可能每个都包含几千行(那是大行!)。SQL Server数据库引擎优化顾问认为无关紧要的数据量。因此,我什至不考虑在这些表上放置显式索引。正确的?
索引的价值在于加快读取速度。例如,如果您基于date列中的日期范围执行大量SELECT,则在该列上放置索引是有意义的。当然,通常,您会以任何重要的频率在要加入的任何列上添加索引。效率的提高还与典型记录集的大小与记录数的比率有关(即,获取20/2000条记录比索引获得90/100条记录带来的收益更多)。在未索引列上的查找本质上是线性搜索。
索引的开销来自写入,因为每个INSERT还需要对每个列索引进行内部插入。
因此,答案完全取决于您的应用程序- 如果它是一个动态网站,其中读取次数可以是写入次数的100倍或1000倍,并且您根据数据列进行频繁的,完全不同的查找,则索引编制可能会很有用。但是,如果写的数量大大超过读的数量,那么您的调优应该专注于加快那些查询的速度。
无论是在JOIN / WHERE列上使用索引还是不使用索引,都可以花费很少的时间来确定和基准化您的应用程序中最频繁的操作,我建议您这样做。监视生产应用程序并识别最昂贵,最频繁的查询,并将优化工作重点放在这两组查询的交集上也很聪明(这可能意味着索引或其他完全不同的查询,例如分配更多或更少的内存用于查询或加入缓存)。