我是数据库的初学者,我不确定是否正确理解它们。
据我所知,给定一个包含多个列的表,我可以进行如下查询:
SELECT * FROM table WHERE col1>3
。
此查询具有复杂性N
。为了提高搜索效率,我可以使用col1
作为索引。在这种情况下,相同的查询应该具有复杂度log(N)
。
据我所知,在sqlalchemy中可以搜索列,将其设置为主键。
如果这是正确的,我不明白为什么我无法将带有重复项的列设置为主键。
例如:
import sqlite3
from sqlalchemy import *
metadata = MetaData()
table = Table('example', metadata,
Column('col1', Integer, primary_key=True),
Column('col2', Integer))
engine = create_engine('sqlite:///:memory:', echo=True)
con = engine.connect()
table.create(engine, checkfirst=True)
data = [{'col1':1, 'col2':2}, {'col1':3, 'col2':4}, {'col1':3, 'col2':4}]
ins = table.insert().values(data)
con.execute(ins)
print list(con.execute("SELECT * FROM example"))
returns
IntegrityError: (sqlite3.IntegrityError) PRIMARY KEY must be unique [SQL: u'INSERT INTO example (col1, col2) VALUES (?, ?), (?, ?), (?, ?)'] [parameters: (1, 2, 3, 4, 3, 4)]
如何在log(N)中搜索非唯一列?
编辑:这个例子是用sqlite编写的,但我实际上是在使用postgres 。答案 0 :(得分:1)
据我所知,在sqlalchemy中可以搜索列,将其设置为主键。
主键列会自动编入索引,但您经常需要索引非唯一列。您可以使用index
keyword argument:
table = Table('example', metadata,
Column('col1', Integer, index=True),
Column('col2', Integer)
)
您可以在日志文件中看到相应的SQL:
INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_example_col1 ON example (col1)