聚集索引于非聚集索引
1.数据库是什么?
数据库是把东西有序放好,还能随时找到的工具
应用程序,有序的数据管理----数据在硬盘(持久化;唯一的,多线程操作需要加锁;速度慢,可以SSD加快速度)
1000w---2G,那找个东西很慢,怎么样性能好一点?就是索引。
2.聚集索引(聚簇索引)图书馆,就是书多
分类---文学/武侠/IT---每个类别还有很多书,按照首字母排序
飞雪连天射白鹿,笑书神侠倚碧鸳---鹿鼎记--L
把数据有序的摆放,物理排序
找字母a开头
找时间范围的
SqlServer自增int,默认聚集索引,所以查询不排序就是id排序
换聚集索引,很耗时,很多硬盘操作,生产环境要谨慎
聚集索引只有一个,但是可以有多个字段
一般是自增主键/创建时间/价格
因为数据物理排序,当然查询快!
非常适合大于 小于 between 还有order by
聚集索引不能运算,不能like'% %' 索引条件在前
聚集索引
新华字典文字排序都是按字母顺序
3.非聚集索引
偏旁部首找字--找页码--看详情
徐
图书馆电子查找,
输入书名--楼层-书架-层
重复存储值和路径,体积小一些,
查找快,快速定位,直达目标
非聚集索引
不影响数据的物理排序,但是重复存储一个数据和位置
找数据:先找索引--快速定位--拿到数据
查找快,但是有维护索引的成本,不是越多越好
非聚集索引,可以多个,每个索引也可以多个字段
适合经常查询的字段,名称/账号
非聚集索引不能运算,不能like'% %',索引条件在前
4.建立索引的原则/建议:
1 主键是必须建立索引的(推荐数值主键,性能最高)
2 外键列也要索引
3 经常查询的建立索引
4 经常在where里面
5 order by / group by /distinct
6 聚合运算/where条件时,先索引字段
7 基本不怎么查询,
8 重复值比较多的不要索引(sex/state)
9 text/image 不要索引
10 索引不要太多了
5.执行计划: 提交sql语句,数据库查询优化器,经过分析生成,制定多个查询方式,从中选择资源使用最少的 数据库制定执行计划是按照使用资源最少,而不是时间最短
受影响的行数
影响的字节数
影响的数据大小
执行计划:
1 Table Scan 全表扫描 性能最差
2 Cluster Index Scan 性能最差,同上 虽然有聚集索引,其实也是全表扫描
3 Index Seek(NonClustered) 性能非常高
4 Index Scan 先index,再扫描
5 Cluster Index Seek 性能最高
一般出了问题,看看执行计划,找出scan,换索引,看效果,尝试
profiler好工具
SELECT TOP 1000 *
FROM [advanced8].[dbo].[JD_Commodity_001]
with(index= NonClusteredIndex)
强制要求走XX索引
常规的SQL优化建议:
1 对列的计算要避免,任何形式都要避免
2 in查询 or查询,索引会失效,可能是拆分
3 in 换exists
not in 不要用,不走索引
4 is null和is not null 都不走索引
5 <> 也不走索引
可以拆分成> 和<
6 join时,链接越少性能越高
左链接,以左边的结果为准
右链接反过来,
连接字段要求带索引