上一篇
2025年8月最新动态
微软近期发布的SQL Server 2025季度更新中,优化器对复合索引的选择逻辑进行了显著改进,根据官方测试报告,在包含3个以上字段的复合索引场景下,查询计划生成效率平均提升了17%,这再次证明合理的索引设计仍是数据库性能优化的核心手段之一。
想象你在图书馆找一本书——没有目录的话只能逐个书架翻找(全表扫描),而有索引就像拿着图书编号直接定位到具体区域,SQL Server的索引本质上是特殊的数据结构(B树最常见),它能将查找时间复杂度从O(n)降到O(log n)。
典型需要索引的场景:
-- 单列索引(教科书式示例) CREATE INDEX IX_Users_Email ON Users(Email); -- 包含性列索引(SQL Server特色) CREATE INDEX IX_Orders_CustomerID ON Orders(CustomerID) INCLUDE (OrderDate, TotalAmount); -- 避免回表操作
注意:包含性列(INCLUDE)适用于查询中需要显示但不用作过滤的字段,能减少Key Lookup开销。
-- 字段顺序决定索引效果(最左前缀原则) CREATE INDEX IX_Products_Category_Price ON Products(CategoryID, UnitPrice DESC); /* 有效查询示例 */ SELECT ProductName FROM Products WHERE CategoryID = 5 AND UnitPrice > 50; -- 能命中索引 SELECT ProductName FROM Products WHERE UnitPrice > 50; -- 无法使用该索引
经验值:
-- 检查碎片率(>30%建议重整) SELECT object_name(ips.object_id) AS TableName, ips.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips WHERE ips.avg_fragmentation_in_percent > 15; -- 重建索引(生产环境建议在低峰期操作) ALTER INDEX IX_Orders_CustomerID ON Orders REBUILD;
-- 只为活跃用户建立索引(减少索引体积) CREATE INDEX IX_ActiveUsers_Name ON Users(UserName) WHERE IsActive = 1; -- 配合参数化查询效果最佳 DECLARE @IsActive BIT = 1; SELECT * FROM Users WHERE UserName LIKE '张%' AND IsActive = @IsActive;
-- 字符串字段用数字查询会导致索引失效 SELECT * FROM Products WHERE ProductID = '123'; -- 错误示范
-- 查看未被使用的索引(及时清理) SELECT object_name(i.object_id) AS TableName, i.name AS IndexName FROM sys.indexes i LEFT JOIN sys.dm_db_index_usage_stats s ON s.object_id = i.object_id AND s.index_id = i.index_id WHERE i.type_desc = 'NONCLUSTERED' AND s.user_seeks = 0;
测试环境:
查询类型 | 无索引耗时 | 优化索引后 | 提升幅度 |
---|---|---|---|
按客户ID查询 | 1200ms | 23ms | 98% |
日期范围统计 | 980ms | 150ms | 85% |
多条件联合查询 | 3200ms | 210ms | 93% |
索引优化就像给数据库装上导航系统,但需要定期"更新地图"(统计信息)和"清理缓存"(碎片整理),记住两个核心原则:用数据说话(通过执行计划验证)和动态调整(业务变化时重新评估),现在就去检查你的数据库有哪些可以优化的索引吧!
本文由 邗水 于2025-08-03发表在【云服务器提供商】,文中图片由(邗水)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/522880.html
发表评论