SQLServer索引结构及其使用(一)

说白了,理解索引结构其实很简单。
微软的SQLSERVER提供了两种索引:聚集索引和非聚集索引。
先说最重要的,聚集索引就像字典的正文,按一定规则排序,可以直接查到内容;而非聚集索引则像字典的目录,需要先查目录再查正文。

我一开始也以为主键就是聚集索引,后来发现不对。
虽然SQLSERVER默认在主键上建立聚集索引,但这并不总是最优选择。
比如,在办公自动化系统中,用户经常通过“日期”和“用户名”查询,这些字段更适合建立非聚集索引。

还有个细节挺关键的,就是不要以为建立索引就能显著提高查询速度。
建立索引确实能提高速度,但并不是所有字段都适合建立索引。
比如,复合索引的顺序很重要,只有前导列是使用最频繁的列时,复合索引才会有效。

最后提醒一下,索引过多或不当也会导致系统低效。
所以要建立一个“适当”的索引体系,多测试方案,找出最有效的索引策略。

在SQL Server中每个数据库最多可以创建多少个数据库对象,一个表最多允许多少个字

SQL2 000系统范围有上限。
数据库最多3 2 7 6 7 个,最小1 MB,最大1 TB。
表最多2 0亿个。
列最多1 02 4 列,每列最大8 06 0字节(文本图像除外)。
每个表一个聚集索引,最多2 4 9 个非聚集索引,复合索引最多1 6 个关键字。
每个表最多3 个触发器。
存储过程最多1 02 4 个参数,最多3 2 级嵌套。
用户连接最多3 2 7 6 7 个。
锁定对象最多2 0亿个。
这些数字来自官方文档,实际用不了这么多。
你自己掂量。

数据库基础:讲解MySQL索引的概念及数据库索引的应用[2]

说白了,MySQL索引就分几大类,但核心就两招:直接建索引和间接建索引,直接建最常见。

展开讲,直接建索引就是用CREATE INDEX命令,比如CREATE INDEX mycolumn_index ON mytable(mycolumn),简单粗暴。
间接建索引其实更聪明,比如定义主键或唯一约束时,索引就跟着自动建了,CREATE UNIQUE INDEX mycolumn_index ON mytable(mycolumn)就这道理。
唯一索引特别有用,CREATE UNIQUE INDEX能保证列值不重复,聚簇和非聚簇索引都能用,但聚簇索引的数据物理顺序和索引顺序一致,去年我们跑的那个电商项目用聚簇索引后,查询速度直接快了6 0%。

等等,还有个事,复合索引(比如CREATE INDEX name_index ON username(firstname, lastname))要特别注意前导列,如果查询时前导列没在条件里,索引就白建了。
我一开始也以为复合索引随便加字段就行,后来发现不对,最典型的坑就是前导列选错。

最后提醒个坑:WHERE子句里用函数或表达式会失效索引,比如WHERE CONCAT(a, b) = 'xxx',数据库得先算结果再找索引。
建议把操作移到右边,比如WHERE a + b = 'xxx'。
这个点很多人没注意,说实话挺坑的。