You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQLAlchemy与PostgreSQL可搜索列疑问:新手关于索引与主键的困惑

关于SQLAlchemy主键、索引与查询效率的解惑

嘿,我来帮你理清这个困惑~首先得肯定你的基础认知是完全正确的:

  • 当列没有索引时,SELECT * FROM table WHERE col1>3 确实是全表扫描,时间复杂度为 O(N)
  • col1添加索引后,查询会通过索引树快速定位,复杂度降到 O(logN)

接下来咱们拆解你提到的「SQLAlchemy中设置主键可使列变为可搜索状态」这个说法——其实这个表述有点容易误导,本质是:

主键本身就是一种特殊的唯一索引

不管你用的是MySQL、PostgreSQL还是其他关系型数据库,当你在SQLAlchemy里把某个列设为主键时,数据库底层会自动给这个列创建一个唯一索引(同时还会强制该列非空、值唯一)。所以这个列之所以能“高效搜索”,核心原因是它自带了索引,而非“只有主键才能被搜索”。

举个SQLAlchemy的模型例子:

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class Product(Base):
    __tablename__ = "products"
    id = Column(Integer, primary_key=True)  # 主键,自动生成唯一索引
    price = Column(Integer)  # 普通列,无索引
  • id做查询(比如WHERE id=100)时,会用到主键自带的唯一索引,复杂度是O(logN);
  • price做查询(比如WHERE price>100)时,因为没有索引,会走全表扫描,复杂度是O(N)。

如果我们给price手动添加普通索引:

price = Column(Integer, index=True)

这时候price的查询也会变成O(logN),和主键索引的效率逻辑一致——区别仅在于主键索引是唯一且非空的,普通索引允许重复值。

澄清“可搜索状态”的误解

任何列都可以写WHERE条件进行搜索,不存在“不可搜索”的列。所谓“设置主键使列变为可搜索状态”,其实是说主键列自带索引,搜索效率远高于无索引的列,而非只有主键列能被搜索。

总结一下:你之前理解的索引与查询复杂度的关系完全正确,SQLAlchemy设置主键只是帮你自动创建了一个特殊的唯一索引,从而实现高效搜索,底层逻辑和手动添加普通索引是相通的,复杂度都是log(N)~

内容的提问来源于stack exchange,提问作者Donbeo

火山引擎 最新活动