一、创建合适的索引
WHERE子句、JOIN操作、ORDER BY子句中频繁使用的列创建索引,优先选择区分度高(如唯一值多)的列,以提升查询过滤和关联效率。BETWEEN、ORDER BY)或排序的列,其物理存储顺序与索引顺序一致,能大幅减少数据遍历次数。JOIN的列,逻辑上连续但物理存储分散,通过索引页指向数据页的方式加速关联查询。column1和column2),需遵循最左前缀原则(如复合索引(A,B,C),查询条件包含A或A+B或A+B+C时可命中索引,仅B或C则无法使用)。SELECT col1, col2 FROM table WHERE col3=1,若索引包含col3,col1,col2,则无需回表访问数据页,直接从索引获取数据,降低I/O开销。二、避免过度索引
INSERT、UPDATE、DELETE操作的成本(需维护索引结构),尤其是高频更新的表,应控制单表索引数量(建议不超过5个)。sys.dm_db_index_usage_stats系统视图监控索引使用情况(如user_seeks、user_scans、user_lookups计数),删除长期未被使用(如30天内无访问)或重复的索引,减少维护开销。三、定期维护索引
UPDATE STATISTICS table_name或UPDATE STATISTICS table_name index_name命令定期更新,确保优化器做出准确决策(建议每周或在大量数据变更后执行)。ALTER INDEX index_name ON table_name REBUILD(离线重建,需锁表,适用于低峰期)或ALTER INDEX index_name ON table_name REORGANIZE(在线重组,无需锁表,适用于生产环境)命令整理碎片,恢复索引效率。四、监控索引使用情况
sys.dm_db_index_usage_stats查看索引的user_seeks(用户查找次数)、user_scans(用户扫描次数)、user_updates(用户更新次数),分析索引的实际使用价值(如user_updates远高于user_seeks,说明索引维护成本过高,可考虑删除)。SET SHOWPLAN_ALL ON或SQL Server Management Studio(SSMS)中的“显示实际执行计划”功能,查看查询是否使用了预期索引(如Index Seek表示使用了索引,Table Scan表示全表扫描),识别未使用索引或执行计划中的瓶颈(如键查找过多)。五、优化查询语句以配合索引
WHERE YEAR(create_time)=2025,会导致索引失效,建议改为WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31')。WHERE column LIKE '%keyword',无法使用索引,建议改为LIKE 'keyword%')。column为INT类型,WHERE column='123'会强制转换,导致索引失效,应改为WHERE column=123)。JOIN代替子查询(如SELECT * FROM table1 WHERE id IN (SELECT id FROM table2),改为SELECT table1.* FROM table1 JOIN table2 ON table1.id=table2.id,减少嵌套查询的开销)。SELECT *,明确列出所需列(如SELECT col1, col2 FROM table,减少不必要的数据传输)。LIMIT(或TOP)限制返回结果数量(如SELECT TOP 100 * FROM table,避免一次性返回大量数据)。六、高级优化技巧
MAXDOP(最大并行度)参数,让查询利用多核CPU并行执行,加快大数据量查询速度(如ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 4)。type(访问类型,如const、eq_ref、range,越靠前效率越高)、rows(预估返回行数,偏差过大说明统计信息不准确)、Extra(额外信息,如Using filesort表示需要排序,Using temporary表示需要临时表,均需优化)。