在使用数据库处理大量数据时,查询速度是个关键问题。比如你开了个小店,订单表里存了几万条记录,每次查某个客户的购买记录都卡得不行,这时候就得靠索引来提速。
什么是索引
可以把它想象成书的目录。没有目录时,你要找某一章内容只能一页页翻;有了目录,直接跳到页码就行。数据库索引的作用也一样,能快速定位数据,避免全表扫描。
常见数据库中的索引创建语法
不同数据库系统语法略有差异,但基本结构相似。下面列出几种常用数据库的创建方式。
MySQL 创建索引
在 MySQL 中,可以用 CREATE INDEX 语句单独创建索引:
CREATE INDEX idx_username ON users(username);
如果想在建表时就加上索引,也可以这样写:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100),
INDEX idx_username (username)
);
PostgreSQL 创建索引
语法和 MySQL 类似,也是用 CREATE INDEX:
CREATE INDEX idx_email ON customers(email);
支持更多类型,比如想建一个全文搜索用的 GIN 索引:
CREATE INDEX idx_search ON documents USING gin(to_tsvector('english', content));
SQL Server 创建索引
在 SQL Server 中,同样使用 CREATE INDEX:
CREATE INDEX IX_LastName ON Employees(LastName);
如果需要包含额外字段以提升覆盖查询性能,可以用 INCLUDE:
CREATE INDEX IX_LastName_FirstName ON Employees(LastName) INCLUDE (FirstName);
复合索引怎么写
有时候单个字段不够用,比如要同时按“姓”和“名”查找员工。这时就得建复合索引:
CREATE INDEX idx_name ON employees(last_name, first_name);
注意顺序很重要。这个索引适合先查 last_name 再查 first_name 的情况,反过来效果可能就不明显。
唯一索引防止重复
如果你希望某个字段不能重复,比如邮箱地址,可以创建唯一索引:
CREATE UNIQUE INDEX uk_email ON users(email);
一旦有人尝试插入相同邮箱,数据库就会报错,帮你守住数据底线。
什么时候该加索引
不是所有字段都适合加索引。频繁用于查询条件(WHERE)、连接(JOIN)、排序(ORDER BY)的字段更适合。但写得多读得少的表,或者数据量特别小的表,加了反而拖慢写入速度。
就像家门口的小卖部,货品就几十种,每样都贴编码反而麻烦。可要是超市呢?没编码根本找不到东西。
小建议
建完索引后记得观察实际查询表现。有些数据库提供 EXPLAIN 命令,看看是不是真的走索引了。别辛辛苦苦建了个“装饰性”索引,结果没人用。