知用网
白蓝主题五 · 清爽阅读
首页  > 电脑技巧

数据库索引能否跨表使用 详细教程与注意事项说明

平时在写程序或者处理数据的时候,经常会遇到多张表之间关联查询的情况。比如用户信息放在一张表,订单记录放在另一张表,查某个用户的订单时就得连着两张表一起查。这时候就会有人问:能不能建个索引,直接跨表加速查询?

索引是表级别的,不能直接跨表

数据的索引是针对单张表建立的,比如你在用户表的 user_id 上建了索引,那这个索引只对这张表有效。哪怕订单表也有 user_id,也不能直接“借用”用户表的索引。

每张表的索引都是独立维护的,数据库引擎不会自动把两个表的索引拼起来用。就像你家楼下便利店的会员卡,在隔壁水果店是刷不了的,得各自办卡。

但可以通过联合查询间接“利用”多个索引

虽然不能直接跨表建索引,但数据库在执行 JOIN 查询时,可以分别使用两张表上的索引。比如:

SELECT u.name, o.amount 
FROM users u 
JOIN orders o ON u.user_id = o.user_id 
WHERE u.city = '上海';

如果 users 表在 city 上有索引,orders 表在 user_id 上有索引,数据库就可以先用索引快速找出上海的用户,再用索引快速匹配他们的订单,效率依然很高。

视图能建索引吗?要看情况

有些数据库比如 SQL Server 支持在视图上建索引,前提是视图是“物化”的(也就是把结果存下来)。这种情况下,相当于把多表查询的结果固化成一张物理表,然后在这上面建索引,变相实现了“跨表索引”的效果。但在 MySQL 里,视图只是个虚拟表,没法直接建索引。

想优化跨表查询?试试这些办法

如果你发现连表查询特别慢,别指望一个跨表索引一劳永逸。更实际的做法是:

  • 确保关联字段都有索引,比如两张表的 user_id 都建上索引;
  • 避免 SELECT *,只查需要的字段;
  • 必要时可以把频繁查询的多表结果汇总到一张宽表里,定期更新,然后在这张表上建索引。

说白了,数据库没有“跨表索引”这玩意儿,但通过合理设计和组合使用现有索引,照样能把查询速度提上去。