Sqlite创建索引提升数据查询效率记录_240907

创建有效的索引是提高SQL查询性能的关键。以下是一些建议,可以帮助你为SQL查询创建有效的索引:

1. 了解你的数据:在创建索引之前,首先要了解你的数据和查询模式。分析哪些列经常用于WHERE子句、JOIN操作或ORDER BY子句中。这些列通常是创建索引的良好候选者。

2. 选择适当的索引类型:SQLite支持多种类型的索引,如B-tree、R-tree和Hash索引。根据你的查询需求选择合适的索引类型。例如,如果你的查询涉及到范围查询(如日期范围),则B-tree索引可能更适合;如果查询涉及到空间数据(如地理位置),则R-tree索引可能更合适。

3. 避免过度索引:虽然索引可以提高查询性能,但过多的索引可能会导致写入性能下降,因为每次插入或更新数据时,都需要更新索引。因此,要权衡索引的数量和查询性能之间的关系。

4. 使用复合索引:如果你的查询涉及到多个列,可以考虑创建复合索引。复合索引可以覆盖多个列,从而提高多列查询的性能。但是,要注意不要创建过多的复合索引,以免影响写入性能。

5. 考虑使用覆盖索引:覆盖索引是指一个索引包含了查询所需的所有数据,这样查询时就不需要再访问表中的数据行。这可以大大提高查询性能,特别是对于只涉及少量数据的查询。

6. 定期分析和优化索引:随着时间的推移,数据库的使用情况可能会发生变化,导致某些索引变得不再有效。定期分析查询执行计划和性能指标,以确定是否需要重新评估和优化索引。

7. 测试和监控:在实际环境中测试不同的索引策略,并监控查询性能的变化。这将帮助你了解哪些索引对性能提升最有效,以及何时需要调整索引。

总之,创建有效的索引需要深入了解你的数据和查询模式,并根据实际情况进行权衡和优化。

CREATE INDEX IF NOT EXISTS idx_自主限速配置_iccid ON "自主限速配置" (ICCID);
SELECT name FROM sqlite_master WHERE type='index' AND name='idx_自主限速配置_iccid';
df.to_sql(table_name, conn, if_exists='replace', index=False,dtype=dtype_list)
logger.info(f"table_exists:{table_exists},表不存在重新创建-->Excel:{file_path}-{table_name}-共计{total_rows}行-->成功写入数据库")
# 在ICCID列上创建索引以提高查询速度
index_query = f"CREATE INDEX IF NOT EXISTS idx_{table_name}_iccid ON {table_name} (ICCID);"
cursor.execute(index_query)
conn.commit()
def batch_update(updates, db_file, table_name):
    with db_lock:
        try:
            with sqlite3.connect(db_file) as conn:
                conn.execute("PRAGMA synchronous=OFF") #关闭同步
                conn.execute("BEGIN TRANSACTION") #显式开启事务
                cursor = conn.cursor()
                update_values = []
                for update in updates:
                    i,iccid, update_statement, values = update
                    values = eval(values)  # 将字符串转换为元组
                    print(f"当前{i}-{iccid}-{values}-正在更新")
                    update_values.append(values + (iccid,))
                update_query = "UPDATE {} SET {} WHERE ICCID=?".format(table_name, update_statement)
                print(f"{datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')}-cursor.executemany-正在更新中........")
                # 一次性执行多个更新操作
                cursor.executemany(update_query, update_values)
                print(f"{datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')}-cursor.executemany-成功更新行数据")
                conn.execute('COMMIT')  # 提交事务
        except Exception as e:
            print(f"更新行数据时出现错误: {e}")
            logger.error(f"更新行数据时出现错误: {e}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值