上一篇
大家好呀!我是后浪云的技术小哥,今天咱们聊聊数据库优化中特别实用的一个技能——创建索引,就像图书馆没有目录找书会疯掉一样,数据库没有索引查询也会慢到让你怀疑人生!
上周有个做电商的朋友找我吐槽:"我们促销活动时,用户查询商品列表要等5秒以上,客服电话都被打爆了!"我去他们数据库一看——好家伙,几百万条商品数据居然大部分字段都没建索引,数据库引擎每次都要全表扫描,能不慢吗?
这种情况其实特别常见,很多开发者只关心业务逻辑实现,却忽略了数据库优化,今天我就手把手教你用SQL Server的CREATE INDEX语句解决这类性能问题。
简单说,索引就是数据的"快捷查找表",想象一下:
在SQL Server中,索引主要分两种:
创建索引的基本命令很简单:
CREATE INDEX 索引名称 ON 表名 (列名1, 列名2...);
举个实际例子,假设我们有个电商商品表:
CREATE TABLE Products ( ProductID INT PRIMARY KEY, ProductName NVARCHAR(100), CategoryID INT, Price DECIMAL(10,2), StockQuantity INT, CreatedDate DATETIME );
用户经常按商品名称搜索,我们可以:
CREATE INDEX IX_Products_ProductName ON Products(ProductName);
前台经常需要"手机分类下价格从低到高"的查询:
CREATE INDEX IX_Products_Category_Price ON Products(CategoryID, Price);
SQL Server特有的"包含列"功能,可以把非键列包含在索引中:
CREATE INDEX IX_Products_Category_Price ON Products(CategoryID, Price) INCLUDE (ProductName, StockQuantity);
这样当查询只需要这几个字段时,数据库引擎直接从索引取数据,不用回表查整行。
只对部分数据建索引,特别适合大表中只有少量热点数据的情况:
-- 只为库存紧张的商品建索引 CREATE INDEX IX_Products_LowStock ON Products(ProductName) WHERE StockQuantity < 10;
创建索引时会锁表,对于生产环境可以用在线创建:
CREATE INDEX IX_Products_ProductName ON Products(ProductName) WITH (ONLINE = ON);
常见新手误区:
建议定期检查索引使用情况:
-- 查看未使用的索引 SELECT OBJECT_NAME(i.object_id) AS 表名, i.name AS 索引名 FROM sys.indexes i INNER JOIN sys.objects o ON i.object_id = o.object_id WHERE i.index_id NOT IN ( SELECT s.index_id FROM sys.dm_db_index_usage_stats s WHERE s.object_id = i.object_id AND i.index_id = s.index_id AND database_id = DB_ID() ) AND o.type = 'U'; -- 用户表
回到开头的电商案例,我们做了这些优化:
结果?商品查询从5秒降到0.1秒,活动期间系统稳稳的!
索引是数据库优化的第一利器,记住几个要点:
后浪云提醒:索引优化是个持续过程,随着业务变化要不断调整,下次遇到查询慢,先别急着加服务器,看看索引是不是该优化啦!
本文由 瞿木兰 于2025-07-30发表在【云服务器提供商】,文中图片由(瞿木兰)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/483748.html
发表评论