首页 >> 综合 >

数据库如何建立索引

2026-03-17 11:24:29 来源:网易 用户:于雁信 

数据库如何建立索引】很多时候,写好了业务代码,一跑起来查询慢得像蜗牛。这时候大部分人的第一反应就是:给这张表加个索引吧。但这事儿不能瞎搞,建错了不仅不提速,反而拖垮数据库的写入性能。

说实话,索引的本质就是一本“书的目录”。没有它,数据库要查一条数据,就得在几千页、几亿行里翻个底朝天(全表扫描);有了它,它直接告诉你第几页第几行在哪。

下面把建立索引的核心逻辑和操作方式整理了一下,结合实战经验,帮你理清思路。

核心操作与索引类型速览

在实际开发中,我们常用的数据库(如 MySQL、PG、Oracle)底层大多遵循类似的语法规则。建立索引主要分两种路径:一种是建表时顺手一起建(物理结构),另一种是表建好后动态添加(结构维护)。

索引类型 常见创建语句示例 适用场景 潜在代价
: : : :
普通单列索引 `CREATE INDEX idx_age ON users(age);` 针对单一字段频繁查询,如 `WHERE status = 1`。 占用磁盘空间;每次增删改需同步更新索引。
联合复合索引 `CREATE INDEX idx_name_email ON users(name, email);` 查询条件包含多个字段,且顺序匹配最左前缀原则时。 顺序很重要;一旦字段顺序反了可能失效;覆盖范围窄。
唯一性索引 `CREATE UNIQUE INDEX uq_code ON orders(code);` 保证数据不重复,通常用于订单号、手机号等关键字段。 插入时需检查冲突,比普通过滤多一次校验。
主键/聚簇索引 `PRIMARY KEY (id)` (定义表时指定) 表的主标识符,物理存储上按此顺序排列。 一张表只有一个;修改主键成本高;查询速度最快。
全文索引 `FULLTEXT INDEX ft_search ON articles(content);` 针对文本模糊搜索,比如搜索文章段落。 仅支持特定引擎(如 MyISAM/InnoDB);解析文本耗时。

为什么有时候加了索引还是慢?

很多新手容易陷入一个误区:“我加了索引,查询就一定快。”其实不然。这里有几个常被忽略的坑:

1.索引下推失效:如果查询语句里写了 `LIKE '%abc'`(以通配符开头),索引基本废了,数据库还得回到全表扫描。

2.数据类型隐式转换:明明存的是数字 `age`,查询时却用了引号 `'20'`。数据库为了对比,可能会放弃走索引,导致性能断崖下跌。

3.过度索引:不要觉得索引越多越好。每张表的索引建议控制在 5 个以内(特殊情况除外)。因为每次你写 `INSERT` 或 `UPDATE` 的时候,数据库不仅要改数据,还要同时把这五六本“目录”都改了。写入压力过大,系统整体吞吐量反而下降。

4.区分度不够:如果给性别(男/女)这种只有两个值的东西建索引,效果几乎为零。数据库发现扫一下表比对索引还快,自然就不走了。

实际建议:怎么判断该不该建?

在动手敲命令之前,先看看慢查询日志或者执行计划(`EXPLAIN`)。如果看到 `type` 是 `ALL`,说明正在全表扫描。

建索引的顺序推荐优先选高频筛选列。比如一个用户表,如果你经常按 `phone` 登录,那就给 `phone` 建唯一索引;如果是后台管理列表,经常按 `create_time` 排序分页,那么给时间字段建个普通索引能极大提升效率。

最后记住一点:索引是为了读而牺牲写。在读取密集型业务(如电商商品浏览)里,大胆建;在交易写入频繁的业务(如流水账单)里,留点余地,别把所有字段都塞满索引。

  免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!

 
分享:
最新文章